SQL запрос только печать первой строки - PullRequest
1 голос
/ 15 июня 2009

Я кодирую в php, и код берет данные из массива, чтобы получить дополнительные данные из базы данных mysql. Поскольку мне нужны данные из двух разных таблиц, я использую вложенные циклы while. Но приведенный ниже код всегда печатает (echo "a:". $ Data3 [2] или echo "b:". $ Data3 [2];) один раз:

foreach($stuff as $key)
{
    $query3 = "SELECT * FROM foobar WHERE id='$key'";
    $result3 = MySQL_query($query3, $link_id);

    while ($data3 = mysql_fetch_array($result3))
    {
        $query4 = "SELECT * FROM foobar_img WHERE id='$data3[0]'";
        $result4 = MySQL_query($query4, $link_id);

        while ($data4 = mysql_fetch_array($result4))
        {   
            $x += 1;
            if ($x % 3 == 0)
            {
                echo "a: " . $data3[2];
            }
            else
            {
                echo "b: " . $data3[2];
            }
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 15 июня 2009

Прежде всего, улучшите ваш SQL:

SELECT
    img.*
FROM
    foobar foo
    INNER JOIN foobar_img img ON
        foo.id = img.id
WHERE
    foo.id = $key

Вам нужно будет перебирать только один массив.

Кроме того, похоже, что вы на самом деле выбираете только одну строку, так что выпадение одной строки является ожидаемым поведением.

Кроме того, пожалуйста, защитите себя от внедрения SQL, используя mysql_real_escape_string () :

$query3 = "SELECT * FROM foobar WHERE id='" . 
     mysql_real_escape_string($key) . "'";

Обновление : Как подсказал Дэн, пожалуйста, запустите этот запрос в консоли MySQL, чтобы получить результат обратно, чтобы вы знали, с чем играете. Когда вы ограничиваете запрос одним идентификатором, вы, вероятно, вытягиваете только одну строку назад. При этом я понятия не имею, сколько $ ключей находится в $ вещи, но если оно переворачивается один раз, то это будет один.

Возможно, вам лучше перебрать $ stuff и создать предложение IN для вашего SQL:

$key_array = "";
foreach($stuff as $key)
{
    $key_array .= ",'" . mysql_real_escape_string($key) . "'";
}
$key_array = substr($key_array, 1);

...

WHERE foo.id IN ($key_array)

Это даст вам набор результатов с полным списком, вместо того, чтобы отправлять кучу запросов SELECT в БД. Будьте добры к вашей БД и, по возможности, используйте операции на основе множеств. MySQL это оценит.

Я также укажу, что это выглядит так, как будто вы используете текстовые первичные ключи. Целочисленные инкрементные ключи лучше всего работают как PK, и я настоятельно рекомендую вам использовать их!

2 голосов
/ 15 июня 2009

Вы должны использовать JOIN между этими двумя таблицами. Это правильный способ использовать SQL, и он будет работать намного быстрее. Выполнение дополнительного запроса внутри цикла является плохой практикой, например, добавление инвариантного к циклу кода внутри цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...