PHP foreach,查询中使用的数组数据

时间:2011-04-19 11:27:59

标签: php mysql arrays foreach

我有:

$array1 =     //contains places ids and locations;
$array2 = array();
$array3 = array();


  foreach($array1 as $itemz)
  {     
      $array2[] = $itemz[place][id];
      $array3[] = $itemz[place][location][city];

      $sql = "select * from places where id=".$array2." and location=".$array3."";
  }

但是当我打印$ sql时,我得到了:

  select * from places where id=12 and location=Array

任何人都可以告诉我代码有什么问题吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

我很抱歉,但你的代码完全没有意义。我很惊讶你得到了那个结果。让我们来看看吧。

引号在哪里?

$array2[] = $itemz[place][id];
$array3[] = $itemz[place][location][city];

你在这里缺少引号,请添加它们

$array2[] = $itemz['place']['id'];
$array3[] = $itemz['place']['location']['city'];

数组到字符串转换

$sql = "select * from places where id=".$array2." and location=".$array3."";

此声明不应有两个原因。

  1. 假设id是INT的单个字段,并且$array2中有一堆INT,如果没有MySQL IN,您仍然无法比较它们。

  2. 您正在从PHP数组转换为字符串。那不行。

  3. 由于您在循环中运行此$array2[]并且$array3[]将继续更改并且将会增长。

    所以你真正要做的就是提出像

    这样的查询
    $sql = "SELECT * 
            FROM places 
            WHERE 
                 id IN (" . implode(',', $array2) . ") AND 
                 location IN (" . implode(',', $array3) . ")";
    

    但这根本没有意义,因为随着循环的继续,你会逐步检索相同的数据。

    所以我认为你真正想做的是

    $sql = "SELECT * 
            FROM places 
            WHERE 
                 id = {$itemz['place']['id']} AND 
                 location = {$itemz['place']['location']['city']}";
    

    这很可能是你需要的。这会在您遍历数组时检索每行的行。

    我会做的一些改进。

    循环完成后运行一次查询,因此您只需运行一次查询而不是n次。

    另外,请考虑仅检索您需要的列而不是SELECT *

答案 1 :(得分:3)

你不能使用$ array3来构建查询,因为它是一个数组。相反,你可以编码像贝娄 -

 foreach($array1 as $i=>$itemz)
  {     
      $array2[$i] = $itemz[place][id];
      $array3[$i] = $itemz[place][location][city];

      $sql = "select * from places where id=".$array2[$i]." and location=".$array3[$i]."";
  }

答案 2 :(得分:2)

这一行:

 $array3[] = $itemz[place][location][city];

导致创建一个名为$array3的数组,并向其添加一个等于$itemz[place][location][city]的元素,其中包含0的键。当您尝试将此变量嵌入查询时,您会遇到问题,因为它不是字符串。

您可能需要的是:

 $id = $itemz['place']['id'];
 $city = $itemz['place']['location']['city'];
 $sql = "select * from places where id=".intval($id)." and location='".
        mysql_real_escape_string($city)."'";

请注意,我已更改以解决代码(indexing into arrays with constants instead of stringsleaving your code vulnerable to SQL injection)中的其他严重问题。

答案 3 :(得分:1)

为什么在只需要标准变量时使用数组:

$array1 =     //contains places ids and locations;

foreach($array1 as $itemz)
{     
    $id = $itemz['place']['id'];
    $city = $itemz['place']['location']['city'];

    $sql = "select * from places where id='$id' and location='$city'";
}