繁体   English   中英

如何在 PHP PDO for MySQL 中准备带有 VARBINARY 的语句?

[英]How do I prepare a statement with VARBINARY in PHP PDO for MySQL?

这是我用来尝试与使用 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 ) 作为'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 驱动程序中是这样。 八字串'FFFFFFFF'不等于0xFFFFFFFF表示的四字节二进制串。 以下两条 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM