PHP foreach, массив данных, используемых в запросе - PullRequest
1 голос
/ 19 апреля 2011

У меня есть:

$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 ]

4 голосов
/ 19 апреля 2011

Извините, но ваш код вообще не имеет смысла.Я удивлен, что вы получаете такой результат вообще.Давайте пройдемся по нему.

Где цитаты?

$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, и у вас есть набор INT в $array2, вы все равно не можете сравнить их без MySQL IN.

  2. Вы преобразовываете массив PHP в строку.Это не сработает.

Поскольку вы выполняете это в цикле, $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 *

3 голосов
/ 19 апреля 2011

Вы не можете использовать $ 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 голосов
/ 19 апреля 2011

Эта строка:

 $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)."'";

Обратите внимание, что я внес изменения, чтобы исправить некоторые другие серьезные проблемы с кодом ( индексирование в массивы с константами вместо строк и , оставляя ваш код уязвимым для SQL-инъекций ).

1 голос
/ 19 апреля 2011

Зачем использовать массив, когда вам нужна только стандартная переменная:

$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'";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...