Использование Inner Join и mysql_num_rows() всегда возвращают на 1 строку меньше

Я проверил через существующие темы. У меня есть решение для моей проблемы, но я знаю, что это не правильное решение, и мне больше интересно сделать эту работу правильно, чем создать обходной путь.

У меня есть проект, где у меня есть 3 таблицы, диагностика, визиты и лечение. Люди приходят в гости, получают лечение, а лечение ставят диагноз.

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

Для этого сделана эта функция в php:

<?
function returnTandV($dxid){
    include("db.info.php"); 
    $query = sprintf("SELECT treatments.*,visits.* FROM treatments LEFT JOIN visits ON
    treatments.tid = visits.tid WHERE treatments.dxid = '%s' ORDER BY visits.dos DESC",
    mysql_real_escape_string($dxid));

    $result = mysql_query($query) or die("Failed because: ".mysql_error()); 
    $num = mysql_num_rows($result);
    for($i = 0; $i <= $num; ++$i) {
        $v[$i] = mysql_fetch_array($result MYSQL_ASSOC);
        ++$i;
    }

    return $v;
}
?>

Функция работает и будет отображать то, что я хочу - все строки как процедур, так и посещений - в виде 1 большой ассоциации. В массиве проблема в том, что он всегда возвращает на 1 строку меньше, чем на самом деле в базе данных, и я не уверен, почему. Всего 3 строки, но msql_num_rows() будет показывать только как 2. Моя работа заключается в том, чтобы просто добавить 1 ($num = mysql_num_rows($result)+1;) но я бы предпочел, чтобы это было правильно.

3 ответа

Решение

Этот раздел выглядит подозрительно для меня:

for($i = 0; $i <= $num; ++$i) {
    $v[$i] = mysql_fetch_array($result MYSQL_ASSOC);
    ++$i;
}
  1. Вы увеличиваете i дважды
  2. Ты собираешься $i <= $num когда вы, скорее всего, хотите $i < $num

Эта комбинация может быть причиной того, что вы получаете неожиданные результаты. По сути, у вас есть три строки, но вы запрашиваете только строки 0 и 2 (пропуская строку 1).

Если $i = 0, и вы увеличиваете его ДО добавления чего-либо в массив, пропустите первую строку. инкремент $ i ПОСЛЕ того, как цикл запускается с нуля (первая клавиша).

Ибо петли не годятся для этого: достаточно сделать:

$query=mysql_query('  --mysql ---  ');


while ($row=mysql_fetch_array($query)){

$v[]=$row["dbcolumn"];

}

вернуть $ v для вашей функции then.compact и аккуратно. вы можете создать ассоциативный массив, если имя ключа уникально (например, первичные идентификаторы).. $v["$priid"]=$row[1];

Программисты всегда отсчитывают от 0. Итак, вы начинаете свой цикл с 0. Если вы заканчиваете на 2, вы достигли 3 строк.

Row0, Row1, Row2.

Другие вопросы по тегам