php - sprintf() 中的 WHERE 子句

标签 php mysql

我有一个字符串,其中包含多个以逗号分隔的电子邮件地址,即

$emails = “111@abc.com, 222@abc.com, 333@abc.com”;

我有以下可以正常工作的 php 代码

<?php
function cust_get_oldest_items_all($limit = 1) {
    $mSearch = new Search();
    $result = $mSearch->dao->query(sprintf('SELECT pk_i_id FROM %st_item ORDER BY dt_pub_date LIMIT 0, %d', DB_TABLE_PREFIX, $limit ));

    return $result->result();
}
?>

我想在上面的 php 代码中使用 WHERE 子句来仅包含 s_contact_email 位于 $emails 中的项目?

最佳答案

以这种方式处理您的电子邮件:

$emails = "111@abc.com, 222@abc.com, 333@abc.com";
$emailsArr = explode(",",$emails);//make an array of emails    

//Todo: escape each array item (each email) to prevent SQL injection

//surround each email with single quotes
$emailsArr = array_map(function($e){return "'".trim($e)."'";},$emailsArr);

//join. new string looks like >> ('111@abc.com','222@abc.com','333@abc.com')
$emails = '('. implode(",",$emailsArr) .')';

并将您的 SELECT 查询更改为:

SELECT pk_i_id FROM %st_item 
WHERE s_contact_email IN $emails 
ORDER BY dt_pub_date LIMIT 0, %d

安全说明

此修复程序可以工作,但还不够。您必须正确转义每个电子邮件地址或使用准备好的语句来阻止攻击者尝试接管您的数据库(SQL 注入(inject)攻击)

关于php - sprintf() 中的 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407342/

相关文章:

php - 如何正确编写 Doctrine 2 DQL 查询?

php - Symfony 链接到错误的 PHP 版本

java - 以这种方式处理异常以在用户名重复时返回消息

mysql - Eloquent 无法知道实际的主(复合)键

php - html 数据到数组以进行 mySQL 插入

php - 为什么使用wamp向本地服务器发送数据不成功?

php - Laravel - Blade View 中的分页模型排序链接

php - 获取mysql中的 View 定义

javascript - 使用 Node.JS 获取对象对象检索/格式化 MySQL

mysql连接不相关的表