使用PDO预处理和bindParam将数据插入数据库表

7

简单来说,有人能解释一下我在这里做错了什么 - 我只是尝试使用prepare和bindParam插入到数据库中,但所有字段都被插入了0和Null。

$sql = $db->prepare("INSERT INTO db_fruit VALUES (id=? ,type=? ,colour=?)");
$sql->bindParam(1, $newId);
$sql->bindParam(2, $type);
$sql->bindParam(3, $colour);
$sql->execute()

顺便说一下,这种方法对于更新等操作已经对我有效了,但在插入的情况下却不起作用。

3个回答

22

在 A.O 的回答基础上,以下选项也是有效的:

$sql = $db->prepare("INSERT INTO db_fruit (id, type, colour) VALUES (? ,? ,?)");
$sql->execute(array($newId, $name, $color));

而且:

$sql = $db->prepare("INSERT INTO db_fruit (id, type, colour) VALUES (:id, :name, :color)");
$sql->execute(array('id' => $newId, 'name' => $name, 'color' => $color));

可能只是个人偏好,但我觉得这种语法更加简洁。


我被引导相信(可能是错误的,非常新手)bindParam是安全的,并且可以替代my_real_escape_string。您的方法是否同样安全? - gavin stanley
@gavin 是的。PDO绑定参数的方式与您分别调用bindParam()时完全相同。 - Sammitch

12

你的语法不正确,请尝试这个:

$sql = $db->prepare("INSERT INTO db_fruit (id, type, colour) VALUES (? ,? ,?)");
$sql->bindParam(1, $newId);
$sql->bindParam(2, $name);
$sql->bindParam(3, $colour);
$sql->execute();

不需要使用上引号。 - Jonast92
这是您需要的 @Jonast92 - A.O.

3
$sql = $db->prepare("INSERT INTO db_fruit (`id`, `type`, `colour`) VALUES (:id, :name, :colour)");
$sql->bindParam(':id', $newId, PDO::PARAM_INT);
$sql->bindParam(':type', $type, PDO::PARAM_INT);
$sql->bindParam(':colour', $colour, PDO::PARAM_STR);
$sql->execute();

你不必将数组放在“execute”内,因为你已经将值放在“bindParam”内。 - laviku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接