Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO准备语句在MySQL中插入位值_Php_Mysql_Pdo_Prepared Statement - Fatal编程技术网

Php 使用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

如何使用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='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-mysql
SET
数据类型可能更适合您-它作为位掩码检查在内部映射到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();