Php 使用PDO准备语句在MySQL中插入位值
如何使用PDO准备的语句在MySQL中插入位值?下面是我的尝试和结果Php 使用PDO准备语句在MySQL中插入位值,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,如何使用PDO准备的语句在MySQL中插入位值?下面是我的尝试和结果 <?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='SELE
<?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'");
?>
不在要检查的终端附近,但我相信您必须将其键入bind to INT并以INT的形式发送,而不是以“b010101”(或其他任何形式)的形式发送:
快速查看Google就会发现这一点。testIt(0x55)有效吗?@Barmar
testfor85返回id 4和数据255
Hmm,也许你可以从这些问题中得到启发:根据mysql文档,位文本格式是b'01010101'
-你试过了吗?@SamDufel没有准备语句,db::db()->exec(“插入测试(id,数据)值(0,b'01010101')”代码>工作。我尝试将'b“01010101”
更改为'b'01010101'
,但没有更改。使用您的解决方案和测试(0x55)代码>似乎有效。使用PHP转换二进制值而不是绑定可能有效?这篇文章回答了这个问题,但提供了我想听到的答案。PDO似乎不能很好地处理位值。由于这些值不是用户提供的,我想我可以手动将它们添加到查询中。或者可能将所有的位类型一起丢弃,并使用TINYINT(1)
。想法?@user1032531我记得,你不能通过PDO向MySQL发送一点信息:你最多只能发送一个整数,即使这样,如果你没有明确告诉PDO使用整数,它也会以字符串的形式发送。如果您的用例是在数据库中存储位字段,那么bindValue
整数表示法可以正常工作(如上所述)。如果您的用例是从已知的一组可能的位字段中选择“按位字段”,只需在查询中直接对它们进行编码即可。我的应用程序是一个基本的权限系统。我有一个6位的值,表示user_read/user_write/group_read/group_write/public_read/public_write。我的WHERE子句将检查字段的某些位是否已设置。看来我可以用一个罐头来做这件事。同意吗?谢谢你的帮助@user1032531-mysqlSET
数据类型可能更适合您-它作为位掩码检查在内部映射到mysql,但允许您通过字符串标识符访问它。
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
$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();