使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值
Posted
技术标签:
【中文标题】使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值【英文标题】:Insert BIT value in MySQL using PDO Prepared Statement 【发布时间】:2014-10-23 13:42:45 【问题描述】:如何?以下是我的尝试和结果。
<?php
function testIt($value)
$sql='INSERT INTO test(id,data) VALUES(?,?)';
$stmt=db::db()->prepare($sql);
$stmt->execute(array(0,$value));
$id=db::db()->lastInsertId();
$sql='SELECT * FROM test WHERE id='.$id;
$stmt=db::db()->query($sql);
$rs=$stmt->fetch(PDO::FETCH_ASSOC);
echo("Test for $value returns id $rs['id'] and data $rs['data']<br>");
date_default_timezone_set('America/Los_Angeles');
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once('../../ayb_private/dbase.php');
$sql='CREATE TEMPORARY TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, data BIT(8) NOT NULL DEFAULT 00000000, PRIMARY KEY (id) )';
$stmt=db::db()->exec($sql);
testIt('b"01010101"');
testIt('b01010101');
testIt('01010101');
testIt(0x55);
testIt("b'01010101'");
?>
结果:
Test for b"01010101" returns id 1 and data 255
Test for b01010101 returns id 2 and data 255
Test for 01010101 returns id 3 and data 255
Test for 85 returns id 4 and data 255
Test for b'01010101' returns id 5 and data 255
【问题讨论】:
testIt(0x55)
工作吗?
@Barmar Test for 85 returns id 4 and data 255
嗯,也许你可以从这些问题中得到启示:***.com/search?q=pdo+prepare+title%3Abit
根据 mysql 文档,位文字格式是 b'01010101'
- 你试过吗?
@SamDufel 没有准备好的声明,db::db()->exec("INSERT INTO test(id,data) VALUES(0,b'01010101')");
有效。我尝试将'b"01010101"'
更改为"b'01010101'"
,但没有任何变化。
【参考方案1】:
不在要检查的终端附近,但我相信您必须键入 bind 它到 INT 并将其作为 INT 发送,而不是“b010101”(或其他):
$sql='INSERT INTO test(id,data) VALUES(:id,:bit)';
$stmt=db::db()->prepare($sql);
$stmt->bindValue('id', null, PDO::PARAM_NULL);
$stmt->bindValue('bit', (int)$value, PDO::PARAM_INT);
$stmt->execute();
在 Google 上的快速检查发现了这个similar previous answer。
【讨论】:
使用您的解决方案和testIt(0x55);
似乎有效。而不是绑定,也许只是使用 PHP 转换二进制值可能有效?
这篇文章回答了这个问题,但确实提供了我想听到的答案。 PDO 似乎不适用于 BIT 值。由于这些值不是用户提供的,我想我可以手动将它们添加到我的查询中。或者可能将 BIT 类型全部丢弃并使用TINYINT(1)
。想法?
@user1032531 我记得,你不能通过 PDO 向 MySQL 发送一点:你最好总是发送一个整数,即使那样,如果你没有明确告诉 PDO使用整数,它作为字符串发送。如果您的用例是将位字段存储在数据库中,那么bindValue
整数表示并且它可以工作(如上)。如果您的用例是从一组已知的可能位字段中按位字段进行选择,只需在查询中直接对它们进行编码。
我的应用是一个基本的权限系统。我有一个代表 user_read/user_write/group_read/group_write/public_read/public_write 的 6 位值。我的 WHERE 子句将检查是否设置了字段的某些位。看来我可以用 TINYINT 做到这一点。同意?感谢您的帮助!
@user1032531 - mysql SET
数据类型可能更适合您 - 它在内部映射到 mysql 作为位掩码检查,但允许您通过字符串标识符访问它。以上是关于使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值的主要内容,如果未能解决你的问题,请参考以下文章
如何在SELECT FROM PDO Prepared Statement中为搜索框设置多个搜索条件?
PDO Prepared Statement over ODBC Sybase“PARAM 数据流”错误
Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询