Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 for MySQL中使用VARBINARY准备语句?_Php_Mysql_Pdo_Prepared Statement_Varbinary - Fatal编程技术网

如何在PHP PDO for MySQL中使用VARBINARY准备语句?

如何在PHP PDO for MySQL中使用VARBINARY准备语句?,php,mysql,pdo,prepared-statement,varbinary,Php,Mysql,Pdo,Prepared Statement,Varbinary,这是我用来与使用PHP PDO的VARBINARY进行比较的代码: $st = $pdo->prepare('SELECT * FROM `xf_ip` WHERE user_id = ? AND ip = ?;'); $st ->execute(array($new_row[':forums_id'], $hexip)); 我试着用0x('0x.$hexip)以及bindParam)作为它的开头: $st = $pdo->prepare('SELECT * FROM `xf

这是我用来与使用PHP PDO的
VARBINARY
进行比较的代码:

$st = $pdo->prepare('SELECT * FROM `xf_ip` WHERE user_id = ? AND ip = ?;');
$st ->execute(array($new_row[':forums_id'], $hexip));
我试着用
0x
'0x.$hexip
)以及
bindParam
)作为它的开头:

$st = $pdo->prepare('SELECT * FROM `xf_ip` WHERE user_id = :user_id AND ip = :ip;');
$st->bindParam(':user_id', $new_row[':forums_id'], \PDO::PARAM_INT);
$st->bindParam(':ip', $hexip, \PDO::PARAM_LOB);
$st->execute();
这是唯一有效的查询,但它是一个不安全的查询,因为它没有准备好,可能容易受到SQL注入的攻击:

$st = $pdo->query('SELECT * FROM `xf_ip` WHERE user_id = ' . (int) $new_row[':forums_id'] . ' AND ip = 0x' . $hexip);
hexip必须采用不带引号的格式
0xFFFFFFFF
,并且不能采用整数格式,否则MySQL将不接受它


这在PDO中是不可能的吗?

参数的作用总是好像您已将它们作为字符串传递一样,至少在MySQL PDO驱动程序中是这样。八个字符的字符串“FFFFFF”不等于由0xFFFFFFFF表示的4字节二进制字符串。以下两条SQL语句不同:

SELECT * FROM `xf_ip` WHERE user_id = :user_id AND ip = 0xFFFFFFFF
SELECT * FROM `xf_ip` WHERE user_id = :user_id AND ip = 'FFFFFFFF'
但是将'FFFFFFFF'作为参数传递会执行类似于后一条语句的语句

有两种解决方案:

一种是传递一个十六进制数字字符串,但在与列进行比较之前,请在SQL中使用UNHEX()将这些十六进制数字转换为等效的二进制字符串:

SELECT * FROM `xf_ip` WHERE user_id = :user_id AND ip = UNHEX(:ip)
另一种解决方案是在PHP中首先取消对二进制字符串的十六进制操作后传递二进制字符串:

$binip = hex2bin($hexip);
$st->bindParam(':ip', $binip, \PDO::PARAM_LOB);

看看这是否有用。varbinary字段中没有什么特殊的内容。您只需将它们与其他数据进行比较。你从哪里得到的$hexip,为什么是hex?它很有效!!!非常感谢你。这个问题从12月初开始就让我抓狂。开玩笑说,我认为bindParam会自动将PHP十六进制整数转换为二进制。如果它这样做了,您将如何搜索恰好由数字0-9和字母a-F组成的文本字符串?:-)好的,我在用dechex和bind类型将其转换为十六进制后提供了一个整数,所以我认为它会将其转换为二进制,而不是将其作为字符串。我实际上忘记了我可以在PHP中操作原始二进制文件。