PDO数据类型不强制执行类型转换

时间:2017-07-03 23:29:06

标签: php mysql pdo

我对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';
}

然后,执行完成后,该值将作为整数存储在数据库中,而不是字符串,并且不会出现错误。

2 个答案:

答案 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 数据库。