我正在尝试使用PHP和PDO阻止SQL注入。我用它作为参考。 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers。我的代码没有给我任何错误,但进入的值都是null。
我试图插入的值是不 null。我知道这是因为我已经回应了他们:
echo "\nDate: ".$date." Name: ".$name." mail: ".$mail."Comment: ".$comment." website: ".$website;
$sql = "INSERT post SET timeDate = :timeDate and name = :name and mail = :mail and comment = :comment and website = :website";
$stmt = $db->prepare($sql);
$stmt->bindParam(":timeDate", $date);
$stmt->bindParam(":name", $name);
$stmt->bindParam(":mail", $mail);
$stmt->bindParam(":comment", $comment);
$stmt->bindParam(":website", $website);
$stmt->execute();
答案 0 :(得分:0)
请勿在作业之间使用AND
- 使用逗号。
$sql = "INSERT post
SET timeDate = :timeDate,
name = :name,
mail = :mail,
comment = :comment,
website = :website";
您在语句之间使用AND
的语句没有错误,因为该语句实际上是有效的。它只是做不到你想象的那样。
就好像你这样做了:
SET timeDate = (:timeDate and name = :name and mail = :mail and comment = :comment and website = :website")
这只将timeDate设置为一个长布尔表达式的结果。
其他列未分配任何内容,只是将它们与参数化值进行比较。由于这是一个尚未插入的新行,所有其他列自然为NULL,因此比较将为NULL。因此,AND
- 将它们放在一起将为NULL,这是将分配给timeDate
列的最终值。
在此语句中未为其他列分配任何值,并且它们的默认值可能为NULL。
这是一个奇怪而无用的陈述,但严格地说,这不是错误。
我也鼓励您更简单地使用PDO。您可以将数组传递给bindParam()
,而不是将execute()
用于所有内容。这与您为每个参数完成bindValue()
的操作相同。您可以使用命名参数或位置参数执行此操作。
$stmt = $db->prepare($sql);
$stmt->execute([
"timeDate" => $date,
"name" => $name,
"mail" => $mail,
"comment" => $comment,
"website" => $website]);
如果您已将参数值存储在数组中,这将非常方便。
防止SQL注入的保护与使用bindParam()
一样好。