/ / mysql_query ("SELECT…") повертає рядок значень NULL для неіснуючого значення первинного ключа, надання (mysql_num_rows> 0) перевіряє марність - php, mysql, null, row

mysql_query (“SELECT…”) повертає рядок значень NULL для неіснуючого значення первинного ключа, візуалізація (mysql_num_rows> 0) перевірка марна - php, mysql, null, row

Я дуже новачок використовувати mysql з php, і ось що я знайшов в Інтернеті, щоб отримати свої результати:

$con = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die("Cannot connect to the database");
$query = "SELECT ... FROM ... WHERE ID=5";
$result = mysql_query($query);
$num = mysql_num_rows($result);
if ($num > 0 ) {
// do stuff
} else {
// inform user
}
mysql_close($con);

ID це автогенерований ненульовий первинний ключ моєї таблиці. Зараз у мене в таблиці 20 записів. Якщо я введіть ID Значення, що відповідає будь-якому з цих існуючих записів, все йде добре і працює за призначенням.

однак, якщо я введіть ID значення, скажімо, 54 або що-небудь, що не відповідає жодному з моїх існуючих 20 записів (мається на увазі жодна рядок із таким ID існує), я очікую $num <= 0 і моя умовна заява перейде до else блок. але я з’ясував, що хіба це не було - воно все одно переходить до TRUE відділення та переходить до // do stuff блок, тому я запустив запит на phpmyadmin і виявив, що я отримую рівно 1 рядок NULL на всіх полях. ось чому $num повернувся 1 який >0.

питання:

  1. як я правильно переходжу до перевірки на відсутність рядків? так що решта мого сценарію буде запущена, лише якщо я дійсно отримаю рядок, що містить дані.
  2. я знайшов mysql_store_result і mysql_free_result під час дослідження в Інтернеті, але немаєдостатньо інформації, щоб змусити їх працювати належним чином. як, наприклад, де я розміщую їх у своєму коді, як я можу зробити те, що мені потрібно робити прямо зараз у php, навіть без них тощо?
  3. будь-які речі "найкращої практики", яких я тут не вистачає при роботі з базами даних mysql в php?
  4. коли мені потрібно викликати кілька заяв sql, те, що я роблю, - перехід через $query-$result-$num процес до i mysql_close мій зв’язок. це "найкраща практика"?

велике спасибі, хлопці, ви все дивовижні.

UPDATE: У тому числі цілий запит

SELECT Dyna,
Floater,
Can.Label as CanLabel,
GROUP_CONCAT(DISTINCT Vanity.Name SEPARATOR ", ") as VanityName,
GROUP_CONCAT(DISTINCT Univ SEPARATOR ", ") as Univ,
ShopDate,
ManuDate,
FlipTran,
Remarks,
Bib,
Abbrev,
ShopChar,
Comment,
Value,
ERUSD
FROM
(Vanity INNER JOIN ((Vanity INNER JOIN Shoppy ON Vanity.VanityID = Shoppy.VanityID) INNER JOIN ShoppyVanity ON Shoppy.ID = ShoppyVanity.ID) ON Vanity.MethodID = ShoppyVanity.MethodID) INNER JOIN UAC ON (Shoppy.VanityID = UAC.VanityID) AND (Vanity.VanityID = UAC.VanityID)
WHERE (((Shoppy.ID)=5))

Відповіді:

2 для відповіді № 1

Якщо ви використовуєте групові функції сукупності, такі як GROUP_CONCAT MySQL створить групу з усього вашого набору результатів. Якщо немає результатів, вони запустять їх NULL значення замість цього, в результаті виходить порожній рядок. Спробуйте додати це в самому кінці запиту, щоб позбутися рядків, у яких немає дійсних даних:

HAVING VanityName IS NOT NULL


1 для відповіді № 2
$num = mysql_numrows($result);

Змінити його на

$num = mysql_num_rows($result);

0 для відповіді № 3

Спробуйте це:

SELECT Dyna,
Floater,
Can.Label as CanLabel,
GROUP_CONCAT(DISTINCT Vanity.Name SEPARATOR ", ") as VanityName,
GROUP_CONCAT(DISTINCT Univ SEPARATOR ", ") as Univ,
ShopDate,
ManuDate,
FlipTran,
Remarks,
Bib,
Abbrev,
ShopChar,
Comment,
Value,
ERUSD
FROM
Vanity INNER JOIN Shoppy ON (Vanity.VanityID = Shoppy.VanityID)
INNER JOIN ShoppyVanity  ON (Shoppy.ID = ShoppyVanity.ID)
INNER JOIN ShoppyVanity  ON (ShoppyVanity.MethodID=Vanity.MethodID)
INNER JOIN UAC           ON (Shoppy.VanityID = UAC.VanityID AND Vanity.VanityID =UAC.VanityID)
WHERE Shoppy.ID=5

0 для відповіді № 4

Використовуйте інше mysql_* функції, такі як mysql_fetch_assoc. Якщо ви читаєте посібник, знайдений на http://www.php.net/manual/en/function.mysql-fetch-assoc.php, ви побачите, що воно повертається false якщо немає рядків для отримання. Як правило, ви можете зробити цей виклик умовним для a while петля, тобто:

while( $row = @mysql_fetch_assoc( $result ) ){
// do something
}

Це буде циклічно, поки він не прочитає останній рядок.