将 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 查询中运行它们?