将 js 数组发布到 PHP 并在数据库查询中使用它

Posted

技术标签:

【中文标题】将 js 数组发布到 PHP 并在数据库查询中使用它【英文标题】:Posting a js array to PHP and using it in a database query 【发布时间】:2020-03-25 22:41:53 【问题描述】:

我希望我的 javascript 函数将多个变量传递给 php,然后让 PHP 在 select 语句中使用这些变量。目前,当我只传递字符串变量时,我的代码就可以工作,但是只要我在查询中添加了这一行:AND newVar IN ('+$myVarArrayPHP+'),查询就不会从数据库中提取任何内容(肯定有一行数据与询问)。非常感谢!!

JS:

var varSring1= "test";
var varString2= "testing";
var varArray= [""] // the number of elements in the array is determined dynamically and are all strings for example: ["grape","mango","apple"]
$.ajax(
   type: 'POST',
   url: "myPHPFile.php",
   data: 
       myVar1: varSring1,
       myVar2: varString2,
       myVarArray: varArray
     ,
   dataType: "json",
   success: function (response)
       if ((response[0]['var1']) != null) 
       document.getElementById("tc-unique-ID-1").value = (response[0]['var1']);

      if ((response[0]['var2']) != null) 
      document.getElementById("tc-unique-ID-2").value = (response[0]['var2']);
   error: function (err) 
            console.error(err.responseText);
        
    );



PHP:


if(isset($_POST[myVar1]) && ($_POST[myVar2]) && ($_POST[myVarArray]))  //check if $_POST[''] exists
  $myVar1PHP= $_POST[myVar1];
  $myVar2PHP= $_POST[myVar2]; 
  $myVarArrayPHP= $_POST[myVarArray]; 

  $ret = pg_query($connection, "SELECT * FROM table 
  WHERE  var1= '$myVar1PHP' AND var2= '$myVar2PHP' AND newVar IN ('+$myVarArrayPHP+');")

  $results=array();
  while($row = pg_fetch_assoc($ret) )
    array_push( $results,$row);
    



【问题讨论】:

查看php.net/manual/de/mysqli.quickstart.prepared-statements.php,因为您的代码极易受到 SQL 注入的攻击。 您需要将$myVarArrayPHP 转换为SQL 可以处理的东西。通常,您的代码应该抛出类似Array to String conversion 的异常,因为您正在像字符串一样使用数组:newVar IN ('+$myVarArrayPHP+');。如果将 SQL 语句移动到新变量并在其后添加 echo $sql_statement;,则可以看到此行为。你的数组应该如何转换为字符串?您能否提供此数组的示例值? @johannes ["grape","mango","apple"] 你是这个意思吗? 【参考方案1】:

你需要告诉 PHP 如何处理数组,例如通过使用implode (PHP documentation):

//check if $_POST['...'] exists
if(isset($_POST["myVar1"]) && isset($_POST["myVar2"]) && isset($_POST["myVarArray"]) && isset($_POST["differentPostedVar"]) && isset($_POST["lastPostedVar"]))
    $myVar1PHP= $_POST["myVar1"];
    $myVar2PHP= $_POST["myVar2"]; 
    $myVarArrayPHP= $_POST["myVarArray"];
    $differentPostedVar = $_POST["differentPostedVar"]; // assumption
    $lastPostedVar = $_POST["lastPostedVar"];

    // newVar IN ($3, $4, $5); and so on
    $first_sql = "SELECT * FROM table WHERE  var1= $1 AND var2= $2 AND newVar IN (put_placeholders_here);";
    $results = execute_prepared_statement($connection, $first_sql, "first_sql", array($myVar1PHP, $myVar2PHP), $myVarArrayPHP);

    if(0 == count($results)) 
        $second_sql = "SELECT * FROM table WHERE differentVar= $1 AND var2= $2 AND newVar IN (put_placeholders_here);";
        $results = execute_prepared_statement($connection, $second_sql, "second_sql", array($differentPostedVar, $myVar2PHP), $myVarArrayPHP);

        if(0 == count($results)) 
            $third_sql = "SELECT * FROM table WHERE 3rdQ= $lastPostedVar;";
            $results = execute_prepared_statement($connection, $third_sql, "third_sql", array($differentPostedVar, $myVar2PHP), $myVarArrayPHP);
        
    

    echo json_encode($results);


function execute_prepared_statement($connection, $sql, $query_name, $normal_params, $in_array = null) 
    $elementsCount = count($in_array);
    $no_of_other_params = count($normal_params); // you need to start with $3 because of $myVar1PHP and $myVar2PHP

    // generate an array that holds a placeholder ($3, $4 etc.) for every value in $myVarArrayPHP
    $binding_placeholders = array();
    for($i = 0; $i < $elementsCount; $i++) 
        $binding_placeholders[] = "$" . ($i + $no_of_other_params + 1);
    

    // array to string conversion (will produce "$3,$4,$5" etc.)
    $placeholders = implode(",", $binding_placeholders);
    // replace placeholder string with actual placeholder string 
    $sql = str_replace('put_placeholders_here', $placeholders, $sql);

    $ret = pg_prepare($connection, $query_name, $sql);

    // using array_merge to create one array having all parameters
    $parameters = array_merge($normal_params, $in_array); 

    $result = pg_execute($connection, $query_name, $parameters);

    $results=array();

    while($row = pg_fetch_assoc($ret) )
        array_push( $results, $row );
    

    return $results;

implode(',', $array);["grape", "mango", "apple"] 转换为字符串:grape,mango,apple。现在 SQL 可以处理它了。

pg_prepare()prepared statement 的文档:PHP Documentation

编辑

    我错过了数组索引周围的" implode() 是正确的想法,但我将它用于错误的事情,因为它会生成 "grape, mango, apple",因此您的数据库将完全查找此字符串。相反,我们需要寻找"grape", "mango", "apple"。 使用PHP的splat操作符动态反汇编$myVarArrayPHP

灵感来自https://supunkavinda.blog/php-mysqli-prepared-where-in。

第二次编辑 由线程开启者回答另一个问题,以根据先前语句的count($results) 执行多个查询。

【讨论】:

发生了什么变化?您是否在语句行后添加了echo $sql;?抛出了哪些错误?您需要提供更多信息,以便我们为您提供帮助。 我把"SELECT * FROM table WHERE var1= $1 AND var2= $2 AND newVar IN ($3);"放在你有'SELECT * FROM shops WHERE name = $1' 的地方,然后在if语句之后我把echo json_encode($results);。在我的 javascript 中的成功函数中,我有 if ((response[0][var2]) != null) 这给了我错误: SCRIPT5007: Unable to get property 'var2' of undefined or null reference。该数组也由用户填充。 您的 JavaScript 控制台中显示的 console.log(response); 是什么?在直接访问其字段之前,您需要先分析response 的值。 当我像以前一样拥有 PHP 文件时,响应会从数据库中提取我想要的信息行。当我将其更改为您所说的操作时,响应会给出 null 值。 @user22 我分析了这个问题,我想我找到了一个合适的解决方案(见编辑)。可以试试吗?

以上是关于将 js 数组发布到 PHP 并在数据库查询中使用它的主要内容,如果未能解决你的问题,请参考以下文章

PHP 如何从 AJAX 调用中发布多个数组/json 值并在同一个 SQL 查询中运行它们?

从 JS 到 PHP 的对象数组 [重复]

通过AJAX向PHP发布JS多维数组

Vue.js - 如何将 prop 作为 json 数组传递并在子组件中正确使用?

如何使用索引号将数据发送到mysqli(准备好的语句)

JS数组到PHP并使用PDO更新MYSQL中的表