2010-10-19 3 views
0

Я использую простой скрипт PHP для части активации одного из моих приложений. Приложения помещают одну переменную на страницу (http://validate.zbrowntechnology.info/WebLock.php?method=validate). Переменная - это серийный номер, размещенный как «Последовательный». Каждый раз, когда я отправляю на эту страницу, он возвращает Invalid. Вот код:Ошибка проводки недействительна

<?php 

$serial = $_POST['Serial']; 
$method = $_GET['method']; 

$con = mysql_connect("HOSTHERE", "USERHERE", "PASSHERE"); 
if(!$con) { 
    die('Unable to connect to MySQL: ' . mysql_error()); 
} 


if($method == "validate") { 

    mysql_select_db("zach_WebLock", $con); 

    $query = "SELECT Key, Status FROM Validation WHERE Key='".mysql_real_escape_string($serial)."'"; 
    $result = mysql_query($query); 
    if(mysql_num_rows($result) > 0) { 
    echo "Valid"; 
    } else { 
    echo "Invalid"; 
    } 
} else { 
    echo "Unkown Method"; 
} 
?> 

Здесь ошибка С PHP,

PHP Warning: mysql_num_rows() ожидает параметр 1, чтобы быть ресурсом, логический данный

+0

Попробуйте добавить инструкцию else .. if ($ method == 'validate') {// здесь код} else {echo 'No method'; } – mellowsoon

+2

Прежде чем спросить, что не так со сценарием, вы должны попробовать выполнить запрос непосредственно в MySQL. «SELECT Key, Status FROM Validation WHERE key = '123» или то, что вы считаете значением сериализации. – mellowsoon

+0

@mellowsoon, попробовал, и он вернулся правильно. –

ответ

3

Сразу после запроса используйте mysql_error(), чтобы узнать, что произошло. И Ключ - плохой выбор для имени столбца, потому что это зарезервированное слово в SQL. Вы можете заключить его в ``, чтобы сообщить MySQL, что это идентификатор. Сделайте еще несколько отладок:

... 
if (!mysql_select_db("zach_WebLock", $con)) die('mysql_select_db failed'); 

$query = "SELECT `Key`, Status FROM Validation WHERE `Key`='".mysql_real_escape_string($serial)."'"; 
print "query=$query<br>\n"; 
$result = mysql_query($query, $con); 
print "error=" . mysql_error($con); 
... 
+0

+1 для вас! Вот в чем проблема! Благодаря! –

+0

Имя ключевого столбца? Я ненавижу, когда это происходит. Недавно я взял базу данных, в которой есть столбец с именем «date» в нескольких таблицах. – gregjor

+1

Чтобы быть справедливым, некоторые другие люди ниже сказали вам сделать то же самое 30 минут назад;) – mellowsoon

0

Попробуйте Like This
$query = "SELECT Key, Status FROM Validation WHERE Key='".$serial."'";

+0

Это не имеет никакого значения. Если вы используете двойные кавычки, переменные в строках заменяются их значением. – Mischa

+0

Спасибо, теперь он что-то возвращает. Но, независимо от того, какой ключ я отправляю, он возвращает недействительный. Клавиша temp - _2772_. –

0

Что произойдет, если на последней строке вы добавите это?

else echo 'Unknown method'; 

Что может происходить в том, что $ _POST и $ _GET не получают заселены, это установка в php.ini, если я правильно помню (поиск «суперглобальные» в PHP документации).

Редактировать: также у вас очень плохая угроза безопасности, Google "sql injection". В основном проблема заключается в том, что вы можете получить любой SQL непосредственно в вашей базе данных, и если у пользователя php достаточно полномочий, это может означать, что любой может удалить, например, все данные из вашей таблицы Validation. Вы должны, по крайней мере, сделать что-то вроде этого:

$query = "SELECT Key, Status FROM Validation WHERE Key='".addslashes($serial)."'"; 
+0

Он все еще возвращает _Invalid_. –

+1

Используйте mysql_real_escape_string() вместо addslashes() – mellowsoon

+0

@mellowsoon, спасибо! Я полностью забыл о SQL Injection. –

1

Вы пропустили закрывающую скобку на этой линии:

if(mysql_num_rows($result) > 0 { 

ли, что отсутствует в вашем коде или просто ваш вопрос?

Вы также можете добавить

if (!$result) { 
    print mysql_error(); 
} 

после запроса

+0

Извините, исправить. –

+0

Да, хорошо заметили! – Mischa

+0

@ Zach, означает ли это, что теперь это работает? – Mischa

0

Это может быть опечатка, но вам не хватает закрывающей скобки здесь:

if(mysql_num_rows($result) > 0 { 
          ^ 

И вы могли бы получились вы отправляете сообщение об ошибке, и в этом случае вы получаете пустую страницу.

0

Try вторя $ серийный номер:

echo $serial; 

И это то, что вы ввели в форме?

+0

Да, он возвращает правильный ключ. –

+0

Хорошо, но вы уверены, что выбрали правильную базу данных с таблицей валидации? Я знаю, что это глупый вопрос, но иногда такие вещи случаются. – Winis

+0

попробуйте повторить значение mysql_real_escape_string ($ serial). Это все то же самое? – mwotton

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