如何在PDO预处理语句中使用BIT(1)列?

11 浏览
0 Comments

如何在PDO预处理语句中使用BIT(1)列?

我有一个数据库表,其中有几个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 ");
// 第一次尝试
$stmt->bindValue('bit_col', $_POST['bit_col']);
// 第二次尝试
$stmt->bindValue('bit_col', $_POST['bit_col'], PDO::PARAM_INT);
// 第三次尝试
$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列?如果可能,应该如何处理?

0
0 Comments

问题的原因是在使用PDO预处理语句时,将一个BIT(1)列与一个变量绑定时出现了问题。根据代码中的提示,尝试使用bindValue()方法将变量与:bit_col绑定,但结果并没有如预期那样工作。

解决方法是将PDO的ATTR_EMULATE_PREPARES属性设置为false。这样可以确保PDO实际上使用预处理语句,而不是模拟它们。通过设置该属性,可以解决与BIT(1)列相关的绑定问题。

以下是修复问题的代码示例:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $dbh->prepare("UPDATE tablename SET bit_col = :bit_col");
$stmt->bindValue(':bit_col', $_POST['bit_col'], PDO::PARAM_BOOL);
$stmt->execute();

在这个例子中,首先将ATTR_EMULATE_PREPARES属性设置为false,然后使用bindValue()方法绑定变量与:bit_col,并指定数据类型为PDO::PARAM_BOOL以确保正确的绑定。最后,调用execute()方法执行预处理语句。

通过这个解决方法,可以正确地使用PDO预处理语句与BIT(1)列进行绑定操作。

0
0 Comments

当使用PDO准备语句与BIT(1)列一起使用时,会出现以下问题和解决方法:

问题的原因是PDO::ATTR_EMULATE_PREPARES属性会导致PDO与BIT列稍有不同的交互。如果将其设置为false,则可以像正常情况一样插入值,MySQL会在后台执行必要的转换。但是,如果PDO模拟准备语句,您需要以某种方式添加一个b来指示它是BIT类型。如果将b放在绑定参数中,PDO会转义单引号,并且最终发送到MySQL的内容将类似于'b\'0\'',这显然是无效的。因此,b需要放在查询中,而不是绑定参数中。使用命名参数执行此操作会产生上面的"绑定变量的数量与标记的数量不匹配"错误,因为PDO不会将'b:'后面跟有b的字符串识别为命名参数。然而,当您使用问号参数标记时,PDO会将其识别为参数,如下所示:

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

还要注意,如果禁用了模拟准备语句,此查询将因语法错误而失败,因此不幸的是,根据是否模拟准备语句,查询需要完全不同的处理方式。

0