Только одна строка возвращена в MySQL поиска данных - PullRequest
1 голос
/ 19 октября 2010

Во-первых, извините за длинный вопрос ... но это заставляет меня задуматься. Любая помощь будет с благодарностью принята.

Я написал следующую функцию для возврата данных из базы данных mysql:

function injuryTable()
{
    # get all players that are injured and their injuires...
    $sql = "SELECT players.id, players.injury_id, players.pname, injuries_date.name, start_date, end_date
            FROM players INNER JOIN injuries_date
            ON injury_id = injuries_date.id";

    $result = sqlQuery($sql);

    return $result;
}

Функция sqlQuery выглядит следующим образом:

function sqlQuery($sql)
{
    $products = array();
    $link = dbConnect('localhost', 'root', '', 'umarrr');
    $result = mysqli_query($link, $sql); 

    while ($row = mysqli_fetch_array($result))
    {
        $products[] = $row;        
    }

    #   return each row:
    return $products;
    #mysqli_close($link);
}

Все это связано с базой данных, и все работает нормально. Однако, когда я пытаюсь перебрать результаты: он возвращает только одну строку:

$injury_table = injuryTable();

// make it more readable:
foreach ($injury_table as $table);
{
    echo $table['pname'];
    echo $table['name'];
    echo $table['start_date'];
    echo $table['end_date'];
}

Выражение sql, которое я написал выше, прекрасно работает в браузере запросов mysql, так кто-нибудь знает, в чем может быть проблема?

Выход print_r($injury_table)

Array ( [0] => Array ( [0] => 1 [id] => 1 [1] => 6 [injury_id] => 6 [2] => person [pname] => person [3] => wrist [name] => wrist [4] => 2008-11-21 [start_date] => 2008-11-21 [5] => 2010-11-11 [end_date] => 2010-11-11 ) [1] => Array ( [0] => 2 [id] => 2 [1] => 5 [injury_id] => 5 [2] => woman [pname] => woman [3] => neck [name] => neck [4] => 2009-11-12 [start_date] => 2009-11-12 [5] => 2010-09-09 [end_date] => 2010-09-09 ) [2] => Array ( [0] => 3 [id] => 3 [1] => 4 [injury_id] => 4 [2] => girl [pname] => girl [3] => groin [name] => groin [4] => 2010-11-27 [start_date] => 2010-11-27 [5] => 2010-12-01 [end_date] => 2010-12-01 ) [3] => Array ( [0] => 4 [id] => 4 [1] => 1 [injury_id] => 1 [2] => boy [pname] => boy [3] => achilles [name] => achilles [4] => 2010-02-01 [start_date] => 2010-02-01 [5] => 2010-03-23 [end_date] => 2010-03-23 ) [4] => Array ( [0] => 5 [id] => 5 [1] => 2 [injury_id] => 2 [2] => man [pname] => man [3] => toe [name] => toe [4] => 2010-01-01 [start_date] => 2010-01-01 [5] => 2010-02-02 [end_date] => 2010-02-02 ) )

Ответы [ 3 ]

3 голосов
/ 19 октября 2010

Некоторые вещи для проверки:

  1. Проверьте возвращаемое значение mysqli_query().Вы предполагаете, что запрос выполнен успешно, и слишком много причин для того, чтобы запрос НЕ проверялся каждый раз.Он вернет логическое значение FALSE при ошибке.
  2. Если вы выполняете много запросов в своем скрипте, вы будете открывать новый дескриптор соединения для каждого.По умолчанию это НЕ будут постоянные соединения, поэтому любые транзакции, которые вы можете запустить, будут автоматически откатываться после использования результатов запроса.Как правило, лучше подключаться к базе данных ОДИН РАЗ (вы можете сохранить дескриптор в статической переменной внутри вашей функции sqlQUery(), если хотите, и использовать ее повторно. Не так много ситуаций, когда вы хотите (или вам нужно) несколькодескрипторы одновременно или совершенно новые сверкающие чистые дескрипторы каждый раз.
  3. Вы пытались выполнить print_r () / var_dump () строк, когда они извлекаются в цикле while ()?выплевывая mysqli_num_rows(), чтобы узнать, сколько PHP-версии запроса возвращается?
  4. Вы просматриваете результаты в браузере? Возможно, что-то в первой или второй строке результатов имеет тег HTML (или что-то в этом роде).что ваш браузер интерпретирует) как HTML-тег и «скрывает» вывод. Просмотрите исходный код страницы, чтобы убедиться, что он действительно не выводится, а не просто скрыт.
  5. И, наконец, о безопасностиВо-первых, это очень плохая практика, позволяющая веб-приложению подключаться к базе данных как «root». Любые недостатки в вашем коде оставят видение сервера БД.Откройте для всех желающих играть. Создайте учетную запись с наименьшим количеством привилегий, необходимых для выполнения работы (возможно, вставьте / обновите / выберите / удалите только), и используйте ее вместо корневой учетной записи.Даже если вы просто играете с этим на частном сервере, это хорошая привычка.
1 голос
/ 19 октября 2010

Действительно плохой (и, возможно, оскорбительный) ответ ...

foreach ($injury_table as $table);
{
    echo $table['pname'];
    echo $table['name'];
    echo $table['start_date'];
    echo $table['end_date'];
    echo '<br/>'; // HTML new line
}

Или

foreach ($injury_table as $table);
{
    echo $table['pname'];
    echo $table['name'];
    echo $table['start_date'];
    echo $table['end_date'];
    echo "\n"; // Console new line
}
1 голос
/ 19 октября 2010

Почему вы открываете новое соединение с базой данных для каждого звонка? Это очень неэффективный способ выполнения запросов. Я бы передал соединение с базой данных в качестве параметра, или, поскольку вы используете mysqli, просто передайте $link в качестве параметра.

Относительно того, почему ваш код не работает, я не знаю, но вы можете попробовать некоторые основные сообщения об ошибках со следующим:

$result = mysqli_query($link, $sql) or 
                 trigger_error('Query Failed: ' . mysqli_error($link));

Я бы также добавил MYSQL_ASSOC в функцию извлечения, так как вы не используете массив на основе индекса, это сделает ваш сценарий намного более эффективным.

Надеюсь, это поможет вам.

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