Anda hampir dengan jawapan anda. Seperti yang ditunjukkan oleh Slava Rozhnev, kod anda terbuka kepada suntikan SQL sekalipun. Dalam soalan anda, anda menggunakan ruang letak dalam pertanyaan anda. Apabila anda menyediakan kenyataan, anda memberitahu PDO: 无论我放入其中的内容,都不要执行它,它只是数据. Apabila bersedia, anda boleh mengikat nilai pada pemegang tempat. Ini boleh dilakukan melalui bindValue atau bindParam atau pun menggunakan execute()
OK$stmt->bindValue(1, $id)读取当前值并用它替换占位符。如果您要使用循环,并且 $id 会不断变化,您可以使用 $stmt-bindParam(1, $id) 这会读取 $id 执行查询时的变量。另一种选择是删除 bindValue 调用并让 execute 绑定值。这可以通过将值数组作为参数添加到 execute 调用来完成。在您的情况下,这将是 $stmt->execute([$id]). Saya secara peribadi lebih suka melakukannya kerana ia lebih bersih daripada menambah sekumpulan panggilan bindValue sebelum melakukannya.
Juga ambil perhatian bahawa saya mempunyai $sql 变量的赋值移至 try-catch 块之外。这是因为您想在 catch 中使用变量,如果 PDO 的构造函数抛出 PDOException(在行 $link = new PDO("mysql:host=$servername;dbname= $dbname", $用户名, $密码);
Anda hampir dengan jawapan anda. Seperti yang ditunjukkan oleh Slava Rozhnev, kod anda terbuka kepada suntikan SQL sekalipun. Dalam soalan anda, anda menggunakan ruang letak dalam pertanyaan anda. Apabila anda menyediakan kenyataan, anda memberitahu PDO:
无论我放入其中的内容,都不要执行它,它只是数据
. Apabila bersedia, anda boleh mengikat nilai pada pemegang tempat. Ini boleh dilakukan melalui bindValue atau bindParam atau pun menggunakan execute()OK
$stmt->bindValue(1, $id)
读取当前值并用它替换占位符。如果您要使用循环,并且$id
会不断变化,您可以使用$stmt-bindParam(1, $id)
这会读取 $id 执行查询时的变量。另一种选择是删除bindValue
调用并让execute
绑定值。这可以通过将值数组作为参数添加到execute
调用来完成。在您的情况下,这将是$stmt->execute([$id])
. Saya secara peribadi lebih suka melakukannya kerana ia lebih bersih daripada menambah sekumpulan panggilan bindValue sebelum melakukannya.Juga ambil perhatian bahawa saya mempunyai
$sql
变量的赋值移至 try-catch 块之外。这是因为您想在 catch 中使用变量,如果 PDO 的构造函数抛出 PDOException(在行$link = new PDO("mysql:host=$servername;dbname= $dbname", $用户名, $密码);