Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 函数中超过1的安全pdo mysql语句_Php_Mysql_Pdo - Fatal编程技术网

Php 函数中超过1的安全pdo mysql语句

Php 函数中超过1的安全pdo mysql语句,php,mysql,pdo,Php,Mysql,Pdo,大家好,我的程序员同事们,我目前正在尝试创建一个社交网站,我有点被你选择内容供用户查看和滚动的部分卡住了 假设他们有朋友和追随者,我希望以安全的方式从他们的朋友和追随者的数据库中选择内容。我目前的假设是,我可能会使用这样的代码 $select = "SELECT * FROM tableName WHERE FollowedPersonsID IN (1,2) OR FriendsID IN (9,8)"; $arrayForSecurity = array( arra

大家好,我的程序员同事们,我目前正在尝试创建一个社交网站,我有点被你选择内容供用户查看和滚动的部分卡住了

假设他们有朋友和追随者,我希望以安全的方式从他们的朋友和追随者的数据库中选择内容。我目前的假设是,我可能会使用这样的代码

        $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);
}
$select=“从表名中选择*,其中在(1,2)中跟随personId或在(9,8)中跟随FriendsID”;
$arrayForSecurity=数组(数组(1,2),数组(9,8));
尝试
{
//这些语句对数据库表运行查询。
$result=$pdo->query($select);
$statement=$pdo->prepare(“从表名中选择*,其中在(?)中跟随personId或在(?)中选择FriendsID”);
$statement->execute($arrayForSecurity);
$content=$statement->fetchAll(PDO::FETCH_ASSOC);
}
捕获(PDO$e)
{
//注意:在生产网站上,不应输出$ex->getMessage()。
//它可能会向攻击者提供有关代码的有用信息。
die(“未能运行查询:”.e->getMessage()。“

”“$select”); } foreach($key=>$value形式的内容){ HTMLContentFunction($value); }
在这里你可以看到我有2个IN()函数,它们都需要是php数组,因为你们可以想象人们跟随的人数会随着不同的人而变化


如何使用2个in函数创建一个安全的my 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()
子句变得太大[ballpark:100或更多],因为这可能会导致性能问题。它们基本上只是一堆
子句的浓缩语法。

更多占位符。每个值一个
(?)
(?,?)
等等。@tadman哦,我明白了,你建议我对每个循环或某些东西执行一次“打印问号”?,然后对两个数组的合并版本使用语句execute?我试试看。在一个大的社交网络中,人们可以跟踪1000人甚至更多。这是根据某人跟随过谁或是谁的朋友来选择内容的最佳方式吗?@Jevon engineers,infrastructure,and boatlook of money。不幸的是,我手头没有任何文章,但它们通常是相当深入的解决方案。当你刚开始的时候,在这个层次上担心事情并不是很有成效,当我提出这一建议时,我有点发自内心。我建议的是,在设计应用程序时要考虑到抽象,这样,如果以后确实需要更改一些底层代码和/或基础结构以实现扩展,那么只需在几个定义良好的地方进行代码更改,而不是在整个代码库中搜寻原始查询。在规模上,您可以更好地优化它,但一般原则是相同的。请记住,很多ORM包装器都会为您这样做,这样您就不会暴露在丑陋的基础之下。如今,计算机的速度快得离谱,像这样的查询的编写、传输、解析、执行和返回结果的速度比您键入一个按键的速度还要快。