Использование 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;
}
- Вы увеличиваете
i
дважды - Ты собираешься
$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.