我对PDO数据绑定存在问题或误解,尤其是bindValue()方法, 我搜索了很多,但我还没有找到答案。
这是一个例子,
global $connection;
$name = 22;
$stm = $connection->prepare("INSERT INTO users SET `name` = :name");
$stm->bindValue(":name", $name, PDO::PARAM_STR);
if ($stm->execute()) {
echo 'Done';
}
然后,执行完成后,该值将作为整数存储在数据库中,而不是字符串,并且不会出现错误。
答案 0 :(得分:0)
我不这么认为,请先在浏览器上尝试一下:
$name = '22';
echo $name;
var_dump($name);
如你所见,他将echoOut 22作为一个整数,但它的类型是一个字符串。 PHP在最近的版本中处理了这个问题,如果你试图在$ name变量中添加一些数字就可以了,Eventhought变量就是字符串!
答案 1 :(得分:0)
我最近也遇到了同样的问题,是的,这个特定示例存在缺陷,因为$name = 22;
会毫无问题地进入varchar字段。
所以我的示例是我有一个在db中定义为Integer的字段,并且我有一个int,但有时它作为字符串传递,例如'1'
,即使我将参数与\PDO::PARAM_INT
绑定,它仍然会引发有关隐式转换的错误。
$stmt = $pdo->prepare("SELECT * FROM randTable WHERE intField = :numnum");
$pdo->execute($stmt, [':numnum', '1', \PDO::PARAM_INT]);
我希望这能将注入的字符串强制为int ...,但不是这样。如果有人知道这是为什么,也可以解释这里提出的问题。如果您可以向我发送有关为什么它不起作用的详细信息,将不胜感激!
所以我们要做的是在查询本身中强制我们的类型,也可以在这里执行此操作:
$stmt = $pdo->prepare("SELECT * FROM randTable WHERE intField = CONVERT(int, :numnum"));
$pdo->execute($stmt, [':numnum', '1', \PDO::PARAM_INT]);
我不喜欢这个...但是可以用。
仅供参考,我正在使用 Sybase 数据库。