这个问题在这里已有答案:
你好我的同事程序员,我目前正在尝试创建一个社交网站,我有点卡在你选择内容供用户查看和滚动的部分。
让我们说他们有朋友和粉丝,我想从他们的朋友和他们的粉丝中选择数据库中的内容。我目前的假设是我可能会使用这样的代码。
$select = "SELECT * FROM tableName WHERE FollowedPersonsID IN (1,2) OR FriendsID IN (9,8)";
$arrayForSecurity = array( array(1,2), array(9,8) );
try
{
// These statements run the query against your database table.
$result = $pdo->query($select);
$statement = $pdo->prepare("SELECT * FROM tableName WHERE FollowedPersonsID IN (?) OR FriendsID IN (?)");
$statement->execute($arrayForSecurity);
$content = $statement->fetchAll(PDO::FETCH_ASSOC);
}
catch(PDOException $e)
{
// Note: On a production website, you should not output $ex->getMessage().
// It may provide an attacker with helpful information about your code.
die("Failed to run query: " . $e->getMessage() . "<br><br>" . "$select");
}
foreach ($content as $key => $value) {
HTMLContentFunction($value);
}
在这里你可以看到我有2个IN()函数,它们都需要是php数组,因为你们可以想象人们关注的人数会因人而异。
如何在函数中使用2创建安全的sql语句?
您需要为数组的每个成员生成占位符,然后还将数组与正确位置的所有参数组合并展平。例如:
// props to https://stackoverflow.com/a/1320156/1064767
function array_flatten(array $array) {
$return = [];
array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
return $return;
}
$arr1 = [1,2,3];
$arr2 = [4,5];
$ph1 = implode(',', array_fill(0, count($arr1), '?'));
$ph2 = implode(',', array_fill(0, count($arr2), '?'));
$query = "SELECT * FROM foo WHERE a = ? AND ( b IN ($ph1) OR c IN ($ph2) ) AND d = ?";
$params = array_flatten([0, $arr1, $arr2, 6]);
var_dump($query, $params);
输出:
string(74) "SELECT * FROM foo WHERE a = ? AND ( b IN (?,?,?) OR c IN (?,?) ) AND d = ?"
array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
[5]=>
int(5)
[6]=>
int(6)
}
并且作为一般警告,小心让你的IN()
条款变得太大[球场:100或更多],因为这可能导致性能问题。它们基本上只是一个OR
条款的浓缩语法。