mysql_query ("SELECT ...") возвращает строку значений NULL для несуществующего значения первичного ключа, что делает проверку (mysql_num_rows> 0) бесполезной - PullRequest
1 голос
/ 15 октября 2011

Я очень новичок в использовании 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 процесс до того, как я mysql_close подключусь. это "лучшая практика"?

Большое спасибо, ребята, вы все великолепны.

ОБНОВЛЕНИЕ: Включая весь запрос

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))

Ответы [ 4 ]

2 голосов
/ 15 октября 2011

Если вы используете групповые агрегатные функции, такие как GROUP_CONCAT, MySQL создаст группу из всего вашего набора результатов.Если результатов нет, он запустит их на NULL значениях, что приведет к пустой строке.Попробуйте добавить это в самый конец запроса, чтобы избавиться от строк, в которых нет действительных данных:

HAVING VanityName IS NOT NULL

1 голос
/ 15 октября 2011
$num = mysql_numrows($result);

Измените его на

$num = mysql_num_rows($result);
0 голосов
/ 15 октября 2011

Используйте другую функцию mysql_*, например mysql_fetch_assoc. Если вы прочитаете руководство, которое находится по адресу http://www.php.net/manual/en/function.mysql-fetch-assoc.php,, вы увидите, что оно возвращает false, если нет строк для извлечения. Как правило, этот вызов можно сделать условным для цикла while, т. Е .:

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

Это будет повторяться до тех пор, пока не будет прочитана последняя строка.

0 голосов
/ 15 октября 2011

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...