我有一个字符串,其中包含多个以逗号分隔的电子邮件地址,即
$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/