gpt4 book ai didi

PHP-使用准备好的语句在mysql中插入二进制数据

转载 作者:IT老高 更新时间:2023-10-29 00:16:43 25 4
gpt4 key购买 nike

我必须使用 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 作为准备好的语句的绑定(bind)参数,但我只是想知道插入这个的正确方法是什么,也许它会将来帮助某人。

最佳答案

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

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

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

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

新的prepared statement方法以二进制形式发送所有内容。因此,“1A2F”的好值现在将作为 0x31413246 发送并插入列中。 - source: dev.mysql.com - Prepared statements

相反,通过使用以下方法将十六进制字符串打包成二进制字符串:

$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中插入二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1747894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com