【问题标题】:How to properly convert an array to sql string [duplicate]如何正确地将数组转换为 sql 字符串 [重复]
【发布时间】:2018-01-27 07:57:57
【问题描述】:

说我有这个:

$term_query = "AND t.slug IN ('" . $term_slugs . "') ";

其中$term_slugs id 是这样的数组:

array('foto', 'video');

如果我做一个简单的 implode(),它不会工作,因为它不能是“照片,视频”。所以我应该做一个foreach循环来构建“'照片','视频'”。 但我不能认为这是唯一的方法......真的很不​​雅。还有其他更聪明的方法吗?

【问题讨论】:

  • json_encode 会救你一命
  • @SolaimanKmail 这是你能给出的最不合适的答案。
  • @SolaimanKmail 可能,但不涉及 SQL 查询参数。
  • $term_query = "AND t.slug IN ('" . $term_slugs . "') "; 这很容易受到 SQL 注入攻击。应使用参数化查询和准备好的语句。
  • 您必须从可能发生变化的地方获取数据,否则您不会为它使用变量而烦恼。作为一般原则,最好永远不要信任任何输入,无论它是否直接来自用户。另外,您应该将参数用作标准做法,如果不这样做,我什至不会想到。那么就没有任何疑问了。此外,在更基本的层面上,当您遇到包含撇号等内容的尴尬输入时,它可以帮助避免诸如意外 SQL 语法错误之类的烦恼。

标签: php sql


【解决方案1】:

你可以使用:

$term_query = "AND t.slug IN ('" . implode("','",$term_slugs) . "') ";

但是准备好的语句更好:

$term_query = "AND t.slug IN ('" . implode(",",array_fill(0,count($term_slugs),"?") . ") "

现在可以绑定参数了:

PDO 绑定

$stmt = $pdoObject->prepare($query); //Query is the full query which contains the parametrised $term_query 
foreach ($term_slugs as $index => &$slug) {
    $stmt->bindParam($index+1,$slug); //+1 because PDO parameters are index starting from 1
}

MySQLi 绑定

$stmt = mysqli_prepare($query); //Query is the full query which contains the parametrised $term_query 
$refArray = [ $stmt, array_fill(0,$term_slugs),"s") ]; //first two parameters for bind param
foreach ($term_slugs as $index => &$slug) {
    $refArray[] = &$slug; //mysqli_bind_param needs references
} 
call_user_func_array('mysqli_bind_param',$refArray);

【讨论】:

  • 我认为你的最后一句话是迄今为止最好的解决方案,但更多的解释将非常有助于确保人们将其用于不安全且容易出错的 impoded slugs 数组。
  • 谢谢。以及如何将“ASC”字符串等内容传递/添加到订单语句?我也有同样的问题。
  • @Stratboy 的订单取决于我猜你的桌子看起来如何。如果您有 $orderByArray = [ "column asc", "column2 desc" ] 之类的东西,那很容易。 ascdesc 不能是参数化 AFAIK。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多