【问题标题】:Array to string conversion in... SQLquery and PHP数组到字符串的转换... SQLquery 和 PHP
【发布时间】:2018-05-30 09:39:26
【问题描述】:

我在使用 WHERE 子句中的数组进行 SQL 查询时遇到问题。 例子: 我在下面提供了一些示例数组

$a1[0] = "1"
$a1[1] = "2"
$a1[2] = "3"

PHP、SQL 语句。我使用 file_get_contents 和 json_decode 来请求数组数据。

$requestBody = file_get_contents("php://input");
$requestData = json_decode($requestBody,true);
    if($requestData){
         $invoice_no = $requestData["$a1[]"];
    }
$sqlQuery = "SELECT * FROM table WHERE name = '" . $a1[]. "'";

如果我的数组有一百个值,我如何将数组切换为字符串以能够执行我的代码? 我在 WHERE 子句中有(数组到字符串转换..)错误。

【问题讨论】:

  • 您是想将 $a1[] 这样的数组变量名转换成这样的字符串 "$a1[]" 还是要将数组值转换成字符串
  • 这个问题很混乱。你能告诉我们$requestBody$requestData的确切内容吗?
  • 你能清除你的示例数组转换吗?
  • 我已经为明确的问题和覆盖进行了编辑
  • 你必须遍历你的数组才能得到你正在寻找的值。您不能只在表的字符串值中进行数组比较。

标签: php mysql arrays


【解决方案1】:

重要!请参阅答案底部以获得最佳解决方案!

正如我在评论中提到的,您必须遍历您的数组以检索您希望用于搜索查询的不同索引。您不能简单地将数组分块为搜索字符串并希望获得结果,这就是您收到错误的原因。

为了遍历你的数组,我们必须首先知道数组的长度。 你可以使用PHP函数count();来实现。

这样,

//$a being the name of your array
$length=count($a);

我将要这样做的方法是使用 where 子句构造一个 SQL。然后,我将创建另一个 SQL,将其连接到前一个 SQL 上,然后我将在其中循环遍历数组以使用 OR 语句获取每个索引,以获取匹配的每个结果。

完整示例:

<?php
$a[0] = 1;
$a[1] = 2;
$a[2] = 3;
$a[3] = 4;

$length=count($a);
$i=0;

$sql="SELECT * FROM table_name WHERE ";

while($length > $i)
{    
    $sql .="name='$a[$i]' ";
    if($i+1 < $length)
    {
        $sql .= "OR ";
    }

    $i=$i+1;
}
echo $sql;   
?>

输出:

SELECT * FROM table_name WHERE name='1' OR name='2' OR name='3' OR name='4'

希望这对你有用。

还有其他循环遍历数组的方法,例如 foreach ,您也可以选择使用键。


最佳答案:

在做了一些研究之后,我得出一个结论,在拥有数百个实例的情况下,您可以执行的最佳查询是在 SQL 中使用WHERE IN()

为了实现这一点,我们需要执行 implode();,这是一个 PHP 函数,它将获取您的数组,并将其转换为字符串。工作方式是在implode(); 中声明一个分隔符,这将成为字符串中数组索引的联合连接。举个例子:

implode(', ', $a);

这将分解您的数组,并生成以下字符串:“1, 2, 3, 4”。

换句话说,我们将您的数组转换为与 SQL 中 IN() 函数的语法相匹配的字符串。

您的查询将如下所示:

$sqlQuery = "SELECT * FROM table WHERE name IN('" . implode( "', '", $a ) . "')";

implode(); 的反面是 explode();,您可以在其中使用分隔符将字符串转换为数组。与implode(); 函数的方法相同。

【讨论】:

  • 您可以只使用$sqlQuery = "SELECT * FROM table WHERE name IN ('" . implode( "','", $a ) . "')";,但由于这(和您的解决方案)容易发生 SQL 注入,我不会那样做。
  • 我采用了与他的方法相同的方法。俄亥俄州他应该使用存储过程,和/或清理他的输入。不过,这不是重点。
  • implodeexplode 的不同之处我怎么能决定选择使用呢?马丁你的方法并不适合我的情况,因为我可能有一百个案例,所以这对我来说不是最好的方法。谢谢顺便说一句
  • explode(); 基本上将一个字符串分解为一个数组,在您定义的分隔符处断开,然后以您的 explode(); 为目标。 implode(); 基本相反,取一个数组,做成一个字符串,其中的分隔符就是你的新字符串的联合连接。使用示例更容易,您可以轻松查找。 w3schools 有一些非常简单的例子,让这两个函数的使用很容易理解。
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2016-09-07
  • 2021-02-23
相关资源
最近更新 更多