gpt4 book ai didi

php - 如何将 PDO 预处理语句与 BIT(1) 列一起使用?

转载 作者:行者123 更新时间:2023-11-29 06:40:46 24 4
gpt4 key购买 nike

我有一个包含一些 BIT(1) 类型列的数据库表。如果我忘记准备好的陈述,我可以轻松地做这样的事情:

UPDATE tablename SET
bit_column_1 = b'1',
bit_column_2 = b'0'

这会很完美。但是,无论我尝试什么,在使用准备好的语句时,值始终为“1”。

我已经完成了以下操作,但如果 $_POST['bit_col']0,它们都不起作用:

$stmt = $dbh->prepare("UPDATE tablename SET
bit_col = :bit_col ");
// First attempt
$stmt->bindValue('bit_col', $_POST['bit_col']);
// Second attempt
$stmt->bindValue('bit_col', $_POST['bit_col'], PDO::PARAM_INT);
// Third attempt
$stmt->bindValue('bit_col', "b'{$_POST['bit_col']}'");

然后我尝试更改准备好的语句以将 b 放在那里,但我得到 number of bound variables does not match number of tokens

$stmt = $dbh->prepare("UPDATE tablename SET
bit_col = b:bit_col ");
$stmt->bindValue('bit_col', $_POST['bit_col']);

$stmt = $dbh->prepare("UPDATE tablename SET
bit_col = b':bit_col' ");
$stmt->bindValue('bit_col', $_POST['bit_col']);

另一件值得一提的事情是 PDO::ATTR_EMULATE_PREPARES 设置为 true。将此设置为 false 需要我重构很多东西,因为我不知不觉地管理了数据库连接。

所以我的问题是,是否可以在 MySQL 中对 BIT 列使用准备好的语句,如果可以,如何使用?

最佳答案

PDO::ATTR_EMULATE_PREPARES 导致 PDO 与 BIT 列的交互略有不同。如果它设置为 false,您只需照常插入值,MySQL 将在幕后进行任何必要的转换:

$stmt = $dbh->prepare("UPDATE tablename SET
bit_col = ? ");
$stmt->bindValue(1, $_POST['bit_col']);

但是,如果 PDO 正在模拟准备好的语句,则需要以某种方式在其中放置一个 b 以表明它是 BIT 类型。如果将 b 放在绑定(bind)参数中,PDO 将对单引号进行转义,您最终会得到类似 'b\'0\'' 的内容被发送到 MySQL ,这显然行不通。 b 因此需要在查询中,而不是在绑定(bind)参数中。使用命名参数执行此操作会产生上面的“绑定(bind)变量数与标记数不匹配”错误,因为 PDO 无法将带有 b 后跟 : 的字符串识别为 a命名参数。但是,当您使用问号参数标记时,PDO 确实将其识别为参数,如下所示:

$stmt = $dbh->prepare("UPDATE tablename SET
bit_col = b? ");
$stmt->bindValue(1, $_POST['bit_col']);

由于我们需要将类似b'1'的东西发送到MySQL,因此在绑定(bind)值时使用PDO::PARAM_INT会导致查询失败因为它会变成 UPDATE tablename SET bit_col = b1(数字两边没有引号)所以你必须省略数据类型或使用 PDO::PARAM_STR

另请注意,如果禁用模拟准备语句,此查询将因语法错误而失败,因此不幸的是,查询需要根据您是否正在模拟准备而完全不同地完成。

关于php - 如何将 PDO 预处理语句与 BIT(1) 列一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21719907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com