2012-03-25 5 views
1

Проблема, с которой я столкнулся, - mysql_num_rows дает мне результат 1 всего кода, но когда я сопоставляю его wil 0 в инструкции if, он возвращает true и выполняет код. так что $ license возвращает ........ вместо его фактического значения.mysql_num_rows в выражении if

Я попытался самостоятельно решить эту проблему.

  • Пробовал print_r, чтобы узнать, существуют ли данные. - Да.
  • Пробовал повторять лицензию $ в первой части - возвращает правильное значение.
  • Пытался проверить значение mysql_num_rows - возвращает 1.
  • Matching его с 0 в, если заявление - возвращает истину, когда оно должно быть ложным, так как значение 1.

Любая помощь по этому вопросу?

$check = mysql_query("SELECT * FROM licenses WHERE email='$email'") or die(mysql_error 
                      ()); 
if (mysql_num_rows($check) > 0) 
{ 
    while ($data = mysql_fetch_array($check)) 
    { 
     print_r($data); // for test 
     $name = $data['name']; 
     $license = $data['pid']; 
     echo $license; // test print 1 
     $comments = $data['comments']; 
    } 

    if ($license == "Sgsmorgan") 
     $license = "EWP Discounted Basic (Simpleleveraging)"; 
} 

$count = mysql_num_rows($check); // for test 
echo $count; // returns 1. 
if (mysql_num_rows($check) == 0) 
    $name = ""; 
$license = "..........."; 
echo $license;// test print 2 
$comments = "Email doesnt exist in the database"; 
+2

расширение MySQL устарел и на пути к устареванию. Новый код должен использовать mysqli или PDO, оба из которых имеют важные преимущества, такие как поддержка подготовленных операторов. Кстати, пример кода потенциально уязвим для [SQL injection] (http://unixwiz.net/techtips/sql-injection.html). Параметрируйте утверждение, чтобы закрыть вульверность. – outis

+3

Не используйте ['SELECT *'] (http://stackoverflow.com/questions/321299/), если вы не пишете программу администрирования БД; выберите только нужные столбцы. – outis

+2

Для удобства чтения, пожалуйста, выберите и примените стиль [отступ] (http://en.wikipedia.org/wiki/Indent_style). – outis

ответ

3

Наверняка вы имеете в виду это:

if (mysql_num_rows($check)==0) 
{ 
    $name = ""; 
    $license = "..........."; 
    echo $license; //Test print 2 
    $comments = "Email doesnt exist in the database"; 
} 

Вместо того

if (mysql_num_rows($check)==0) 
$name = ""; 
$license = "..........."; 
echo $license; //Test print 2 
$comments = "Email doesnt exist in the database"; 

Не используя фигурные скобки означает, что в нее входит только первая строка под оператором if. Таким образом, $license всегда установлен в ............

Всегда используйте фигурные скобки.

+0

@ Кишор. Чтобы подтвердить теорию Майкла, какое значение имеет значение '$ name' в конце? – Anthony

+0

Это исправлено. Я буду помнить об этом и не буду повторять это снова :) Спасибо – Kishor

+1

@ Kishor: Я все еще еженедельно получаю ошибки от таких условий, как 'if ($ x = 1)' вместо 'if ($ x == 1) ', поэтому, я уверен, вы повторите все виды вещей снова. Когда вы это сделаете, вы просто поймете, как нанести удар по голове. – Anthony

1

Я считаю, что проблемы является то, что в тот момент, нет больше строк остались, так как ваш while петля принесла все из них.

Если я не ошибаюсь, этот код:

while ($ignored = mysql_fetch_array($check)) { 
    echo "Got a row! Rows left: " . mysql_num_rows($check); 
} 

Если вывести что-то вроде:

Got a row! Rows left: 3 
Got a row! Rows left: 2 
Got a row! Rows left: 1 
Got a row! Rows left: 0 
+0

Будет только 1 строка, где email = '$ email' Я проверил значение mysql_num_rows как $ count перед сопоставлением с 0 в инструкции if. $ count говорит 0, утверждение if также становится истинным. – Kishor

+0

Ницца поймать, Дэвид. – Anthony

+0

@ Kishor - Ну, если это не цикл while, то что произойдет, если вы измените условие на: 'if ($ count == 0)'? – Anthony

1

Вслед за первопричинами Давида, здесь очень просто исправить:

$check = mysql_query("SELECT * FROM licenses WHERE email='$email'") 
     or die(mysql_error()); 

if (mysql_num_rows($check) > 0) { 
    while ($data = mysql_fetch_array($check)) { 
     $name = $data['name']; 
     $license = $data['pid']; 
     $comments = $data['comments']; 
    } 

    $license = ($license == "Blahblah") ? "This is a second level license" : $license; 

} else { 
    $name = ""; 
    $license = "..........."; 
    $comments = "Email doesnt exist in the database"; 
} 
+0

$ license = ($ license == "Blahblah")? «Это лицензия второго уровня»: $ license; Кажется немного запутанным, поскольку я просто изучаю php. В любом случае, это были мои отсутствующие фигурные скобки под последним утверждением if. – Kishor

+1

Да, часть того, почему вы его пропустили, я думаю, это потому, что вы выбрали плохую привычку не закрывать однострочные условные выражения в фигурных скобках, что действительно, но очень трудно читать и может быстро привести к потере отслеживать, где ваши другие условия открываются и закрываются. Следуйте совету Майкла и всегда используйте фигурные скобки. Причина, по которой я изменил эту строку (условный синтаксис, известный как [тройной] (http://us3.php.net/manual/en/language.operators.comparison.php)) заключается в том, что он часто помогает очистить некоторые из тех мест, где вам просто не хочется иметь 3-5 строк кода, чтобы установить 1 var. – Anthony

Смежные вопросы