Я дуже новачок використовувати 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
.
питання:
- як я правильно переходжу до перевірки на відсутність рядків? так що решта мого сценарію буде запущена, лише якщо я дійсно отримаю рядок, що містить дані.
- я знайшов
mysql_store_result
іmysql_free_result
під час дослідження в Інтернеті, але немаєдостатньо інформації, щоб змусити їх працювати належним чином. як, наприклад, де я розміщую їх у своєму коді, як я можу зробити те, що мені потрібно робити прямо зараз у php, навіть без них тощо? - будь-які речі "найкращої практики", яких я тут не вистачає при роботі з базами даних mysql в php?
- коли мені потрібно викликати кілька заяв sql, те, що я роблю, - перехід через
$query
-$result
-$num
процес до imysql_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
}
Це буде циклічно, поки він не прочитає останній рядок.