php 通过表达式在SQL语句中动态设置参数

6ju8rftf  于 2023-06-21  发布在  PHP
关注(0)|答案(2)|浏览(76)

我目前使用的是Yii2框架(特别是https://www.yiiframework.com/doc/api/2.0/yii-db-expression
我遇到了一个问题,在创建多个表达式语句时无法动态设置参数。

$citiesArray = explode("Chicago", "New York", "Dallas");

foreach ($citiesArray as $index => $city) {
  $expression = new Expression(
     'JSON_CONTAINS(
         field_location_addressLocation,
         :city,
         \'$.parts.city\'
     )',
     [':city' => json_encode($city)]
  );
  array_push($cityExpressions, $expression);
};

这里的问题是:city在每次迭代时都被简单地替换,最终,SQL语句转换为只关心最后一个城市(在本例中为“达拉斯”)。
我曾尝试合并循环的索引来创建一个唯一的值,但没有这样的运气:

foreach ($citiesArray as $index => $city) {
   $expression = new Expression(
      'JSON_CONTAINS(
         field_location_addressLocation,
         \':city-$index\',
         \'$.parts.city\'
      )',
     [':city-'.$index => json_encode($city)]
   );
   array_push($cityExpressions, $expression);
};

如果这是可能的?我相信这更像是一个mySQL(MariaDB)问题,而不是Yii问题,因为最终这些表达式被转换为SQL语句。
任何见解将不胜感激。
(我使用的是这里显示的param文档:https://www.yiiframework.com/doc/api/2.0/yii-db-expression#$params-detail)

h6my8fg2

h6my8fg21#

你对替换参数的看法是正确的--参数名应该是唯一的。但是您错误地构建了表达式字符串-变量插值只对"内部的字符串起作用。如果使用',则$index不会被视为$index变量内部的值,而是作为文字字符串$index。试试这个:

foreach ($citiesArray as $index => $city) {
   $expression = new Expression(
      "JSON_CONTAINS(
         field_location_addressLocation,
         ':city$index',
         '\$.parts.city'
      )",
      [':city' . $index => json_encode($city)]
   );
   $cityExpressions[] = $expression;
};
bmvo0sr5

bmvo0sr52#

在那里我找到了上述问题的简单解决方案

$key = $_POST['question'];
$val = $_POST['answer'];
$da = [$key=>$val];
$d=json_encode($da);
$q = Yii::$app->db->createCommand("SELECT data from form_submission WHERE 
JSON_CONTAINS(data,'$d') and form_id=$id")->queryAll();

相关问题