php - 如何在 PHP PDO for MySQL 中使用 VARBINARY 准备语句?
问题描述
这是我用来尝试与VARBINARY
使用 PHP PDO 进行比较的代码:
$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 驱动程序中是这样。八字串'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);
推荐阅读
- javascript - React Native - 使用功能组件向reducer发送数据问题?
- sql - 遇到产品时增加行号 - T SQL - 单个查询(不允许多个语句)
- javascript - 在网站上嵌入私有 Google Drive 图像
- android - Android Emulator 无响应 V4.2.1
- php - 如何从存储在远程 FTP 服务器上的文件在 Lavarel 中创建 ZIP 下载?
- javascript - 动态滑动器只能在第一张幻灯片上显示和循环
- python - 我想将一个函数绑定到 tkinter 中的一个标签,这让我很困惑
- php - 无法从 Windows Azure VM 上的 PHP 访问映射的 Azure 文件共享
- excel - 如何使用另一个宏停止自动刷新单元格的宏?
- javascript - 将 curl 响应数据从 php 发送到 javascript 以呈现 html 或直接在 php 中执行 html 内容