php 插入二进制,PHP-使用预准备语句在mysql中插入二进制数据

我必须使用php的mysql改进库将一行插入到mysql中具有类型为VARBINARY的主键的表中.

该字段的内容是计算的sha1哈希.

如果我以旧的方式运行查询它完美地工作:

$mysqli->$query("INSERT INTO table (id, field1) VALUES (0x" . $id . ",'" . $field1 . "')");

但是当我尝试将其作为准备好的声明执行时,我无法弄清楚如何做到这一点.如果

我执行等效的操作:

if($stmt = $mysqli->prepare("INSERT INTO table (id, field1) VALUES (?, ?)")) {

$stmt->bind_param('ss', "0x".$id, $field1);

//execute statement

}

它会抛出一个异常,说明这个字段的内容太大了.如果我尝试将其作为BLOB字段插入:

if($stmt = $mysqli->prepare("INSERT INTO table (id, field1) VALUES (?, ?)")) {

$stmt->bind_param('bs', $id, $field1);

//execute statement

}

它没有给出错误,插入了行,但标识符字段现在为空(不为空,为空).

我知道我可以混合查询并输入字符串中连接的id和其他字段作为预准备语句的绑定参数,但我只是想知道插入这个的正确方法是什么,也许它会帮助某些人未来.

解决方法:

PHP的sha1函数返回十六进制数字的字符串表示形式.

这意味着如果你将它打印到屏幕上,它将显示一个十六进制数字.但在内存中,它是一堆ASCII字符.

所以,取十六进制数1A2F.作为内存中的ASCII,将是0x31413246,而不是0x1A2F

MySQL的普通接口将所有参数作为字符串发送.使用普通接口时,MySQL会将ASCII字符串转换为二进制值.

新的预处理语句方法将所有内容都以二进制形因此,“1A2F”的漂亮值现在将作为0x31413246发送并插入到列中. – source: dev.mysql.com – Prepared statements

相反,通过使用以下方法将Hex字符串打包成二进制字符串来转换它:

$binId = pack("H*", $id); // this string is not ASCII, don't print it to the screen! That will be ugly.

然后将$binId传递给MySQLi预处理语句而不是$id.

标签:php,mysql,prepared-statement

来源: https://codeday.me/bug/20191001/1838833.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值