2010-12-29 3 views
1

Я пытаюсь перебрать некоторые данные из моей базы данных, но он выводит их дважды.php foreach looping дважды

$fields = 'field1, field2, field3, field4'; 
$idFields = 'id_field1, id_field2, id_field3, id_field4'; 
$tables = 'table1, table2, table3, table4'; 
$table = explode(', ', $tables); 
$field = explode(', ', $fields); 
$id = explode(', ', $idFields); 
$str = 'Egg'; 

$i=0; 

while ($i<4) { 
    $f = $field[$i]; 
    $idd = $id[$i]; 
    $sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%'); 
    $string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>'; 
    $result = $writeConn->fetchAssoc($sql); 

     foreach ($result as $row) { 
      echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>'; 
     } 
    $i++; 
} 

Выведение:

Успех! Найдено яйцо в поле3. ID: 5.
Успех! Найдено яйцо в поле3. ID: 5.

Может кто-нибудь объяснить, почему он перебирает как индексированные, так и ассоциативные значения?

UPDATE

Я сделал несколько больше играть вокруг и попытался следующее.

$fields = 'field1, field2, field3, field4'; 
$idFields = 'id_field1, id_field2, id_field3, id_field4'; 
$tables = 'table1, table2, table3, table4'; 
$table = explode(', ', $tables); 
$field = explode(', ', $fields); 
$id = explode(', ', $idFields); 
$str = 'Egg'; 

$i=0; 

while ($i<4) { 
    $f = $field[$i]; 
    $idd = $id[$i]; 
    $sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%'); 
    $string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>'; 
    $sth = $writeConn->prepare($sql); 
    $sth->execute(); 
    $result = $sth->fetch(PDO::FETCH_ASSOC); 

     foreach ($result as $row) { 
      echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>'; 
     } 
    $i++; 
} 

Самое интересное, что это выводит ниже:

Успех! Найдено яйцо в поле3. ID: E.
Успех! Найдено яйцо в поле3. ID: E.
Успех! Найдено яйцо в поле3. ID: 5.
Успех! Найдено яйцо в поле3. ID: 5.
Успех! Найдено яйцо в поле3. ID: E.
Успех! Найдено яйцо в поле3. ID: E.
Успех! Найдено яйцо в поле3. ID: 5.
Успех! Найдено яйцо в поле3. ID: 5.

Я также попытался добавить $i к выходу, и это выводит 2, как ожидалось. Если изменить fetch(PDO::FETCH_BOTH) на fetch(PDO::FETCH_ASSOC) выход следующим образом:

успеха! Найдено яйцо в поле3. ID: E.
Успех! Найдено яйцо в поле3. ID: E.
Успех! Найдено яйцо в поле3. ID: 5.
Успех! Найдено яйцо в поле3. ID: 5.

Это слишком долго искажало меня, поэтому, если бы кто-нибудь мог помочь, я был бы очень благодарен!

+4

добавив значение $ я на выходе может помочь все ясно. и не должен начинаться с 0? –

+0

Возможно, результат запроса похож на левое соединение и возвращает тот же элемент для каждого элемента объединения. – albanx

+0

у вас есть повторяющаяся строка? Что делает этот запрос в phpMyAdmin (или аналогичном инструменте администратора db)? –

ответ

1

Вероятно, fetchAssoc() возвращает массив с числовыми (0 ~ n) и строковыми (столбцами) ключами. См. PDO::FETCH_BOTH на странице документации PDOStatement::fetch().

Дополнение: И причина этого в том, что почему fetchAssoc() возвращает двойной массив по умолчанию: PHP не делает различий между массивами с числовыми и строковыми индексами; вам тоже нужно использовать.

+0

Я попытался использовать $ sth = $ writeConn-> prepare ($ sql); $ Sth-> Execute(); $ result = $ sth-> fetch (PDO :: FETCH_ASSOC); без везения. Все те же результаты. – Jack

+0

Странно. вы уверены, что это место для установки параметра режима выборки? В какой библиотеке вы используете? – aib

+0

Это для модуля Magento, который я разрабатываю – Jack

0

Забудьте все сложные объяснения. Ваша проблема вызвана использованием echo() внутри этого цикла. У меня была та же проблема (см. Ниже), где цикл foreach запускался дважды без видимых причин.

Если вы хотите, чтобы предоставить информацию внутри вашего PHP кода для целей тестирования, создать текстовую строку и добавить материал к ней нравится:

$result .= "<br>And then this thingy did those stuff"; 

Если вы сделаете это, и только эхо $ результата в конце процесса, вы обнаружите, что ваша проблема исчезла.

Функция echo() беспорядочно сочетается с чувством выполненности PHP в квантовом виде: вы чувствуете, что он уже совершил запуск вашего кода и, как будто он еще не запущен. Я не могу объяснить детали, но результат довольно кварки.

МОЯ ПРОБЛЕМА КАК ЭТО БЫЛО: У меня такая же проблема с другой установкой foreach. В моем случае массив поступает с URL-адреса HTTP-запроса:

//myfakeserver/functions/dealWithIncomes.php?i={%220%22:{%22amount%22:332,%22T1%22:%22month% 22,% 22M1% 22: 1,% 22T2% 22:% 22dayofmonth% 22% 22М2% 22: 20,% 22T3% 22:% 22% 22% 22М3% 22: 0,% 22S1% 22:% 22 % 22% 22E1% 22:% 22% 22},% 221% 22: {22% amount%22:444,%22T1%22:%22week%22,%22M1%22:1,%22T2%22:% 22dayofweek% 22% 22М2% 22: 1,% 22T3% 22:% 22% 22% 22М3% 22: 0,% 22S1% 22:% 22% 22% 22E1% 22:% 22% 22},% 222% 22: {22% amount%22:443,%22T1%22:%22year%22,%22M1%22:1,%22T2%22:%22%22,%22M2%22:0,%22T3%22 :% 22% 22,% 22M3% 22: 0,% 22S1% 22:% 222012-02-29% 22,% 22E1% 22:% 22% 22}}

$ incomes = json_decode ($ _ GET [ 'я'], правда);

Другими словами, строка JSON представляет три дохода и их свойства, такие как количество и повторяемость.

PHP понимает эту строку как массив очень хорошо: SizeOf ($ доходы) возвращает 3.

Но когда я петля через эту вещь ...

Еогеасп ($ доходы как $ дохода) { $ result. = "Работа с одним доходом из массива с длиной". SizeOf ($ доходы); }

... Я получаю ... «Работа с одним доходом от массива с длиной 3» «Работа с одним доходом от массива с длиной 3» «Работа с одним доходом от массива с длиной 3» «Работа с одним доходом от массива с длиной 3» «Работа с одним доходом от массива с длиной 3» «Работа с одним доходом от массива с длиной 3»