За последние 24 часа нас посетили 20166 программистов и 1696 роботов. Сейчас ищет 1521 программист ...

Не передаются переменные в запрос

Тема в разделе "PHP для новичков", создана пользователем Bookvoed, 7 апр 2011.

  1. Bookvoed

    Bookvoed Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте. Не могу найти в чем ошибка.

    На IIS установлен PHP и MySQL, PHP работает, с MySQL соединение есть. Необходимо сделать выборку из базы. В результате запроса выпадает ошибка что не найдено ни одной записи, хотя данные есть и Sqlyog выборку делает. Самое странное что var_dump(); выдает значение принятых переменных, а в запрос к базе они почему то не вcтавляются. Думаю что проблема в разной кодировке символов в базе и в запросе. Такое может быть?

    PHP:
    1. <?php
    2.  
    3. ini_set('display_errors',1);
    4.  
    5. /* connection information */
    6. $hostname =  "localhost";
    7. $user =  "www";
    8. $password =  "pass";
    9. $dbName   =  "web1";
    10. $table    =  "web";
    11. $UserName = $_POST['UserName'];
    12. $State = $_POST['State'];
    13.  
    14. MYSQL_CONNECT($hostname, $user, $password) OR DIE( "Unable to connect to database");
    15.  
    16. @mysql_select_db("$dbName") or die(  "Unable to select database");
    17.  
    18. $query = "SELECT * FROM $table WHERE UserName LIKE '%UserName%';";
    19.  
    20.               var_dump($UserName);
    21.               var_dump($State);
    22.  
    23.              
    24. $result = MYSQL_QUERY($query);
    25.  
    26. if (!MYSQL_QUERY($query))
    27.  
    28. print ("<TR><TD align=center valign=top><font style=\"FONT-SIZE: 12px; FONT-FAMILY: Arial; color: #8a3920\"><b>! $result Произошла ошибка при создании запроса, проверьте правильность запроса.</b></font><p></TD></TR>");
    29.  
    30. /* Determine the number of records returned */
    31.  
    32. //print("<TR><TD align=center valign=top><font style=\"FONT-SIZE: 12px; FONT-FAMILY: Arial; color: #8a3920\"><b>Произошла ошибка при создании запроса, проверьте правильность запроса: $result </b></font><p></TD></TR>");
    33.  
    34.  
    35. WHILE ($row=MYSQL_FETCH_ROW($result))
    36. $number = "mysql_num_rows($result)";
    37. if (!mysql_num_rows($result)) print("<TR><TD align=center valign=top><font style=\"FONT-SIZE: 12px; FONT-FAMILY: Arial; color: #8a3920\"><b>Данные неверны или поиск осуществляется не в той категории, повторите запрос</b></font><p></TD></TR>");
    38.   /* Print the relevant information */
    39.  
    40. ....... вывод результатов
    41.  
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  3. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    вместо var_dump($UserName);
    var_dump($State);

    напиши лучше var_dump($query); и удивись))))

    $number = "mysql_num_rows($result)"; - вообще что-то непонятное)
     
  4. Mamont

    Mamont Активный пользователь

    С нами с:
    5 дек 2010
    Сообщения:
    183
    Симпатии:
    0
    Не?
    $query = "SELECT * FROM $table WHERE UserName LIKE '%$UserName%';";

    Ы:
     
  5. Bookvoed

    Bookvoed Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    3
    Симпатии:
    0
    tommyangelo , var_dump($query); в браузере выдает следующее :

    То есть имя таблицы, имя пользователя подставляется, но запрос не выполняется, видимо где то ошибка в синтаксисе.
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    В целях отлова ошибок поставь после каждого вызова mysql_query проверку
    Код (Text):
    1. if(mysql_errno()<>0){
    2.   echo mysql_error(),"<br/>\n";
    3. }
    Если ошибок с MySql нет, ищем далее.
    В строке 37 у тебя закавычена функция, будто она является строкой. Убрать.
    В запросах типа "SELECT * FROM $table WHERE UserName LIKE '%UserName%';" (кстати, точку с запятой в конце тоже убрать) не рекомендуются начинать критерий совпадения со знака %. Ну если таблица из двух юзеров, то можно оставить. Если их сотни-тысячи, то однозначно придумать что-то другое.

    Присвоение переменных таким образом, как у тебя в 12-13 строчках не надежное.
    $UserName = $_POST['UserName']; и $State = $_POST['State'];
    Сначала нужно указать дефолтное состояние переменной, потом удостовериться, что переданы параметры ('UserName' и 'State'), потом в целях безопасности нужно "проверить" эти переменные на предмет недопустимых символов, чтобы тебе не сделали инъекцию.
    Код (Text):
    1. $UserName='';
    2. if(isset($_POST['UserName'])){
    3.   $UserName=функция_проверки_длины_строки_и_допустимости_символов($_POST['UserName']);
    4. }
    После mysql_connect сделай один запрос для указания кодировки, например:
    mysql_query("SET NAMES 'UTF8'"); (или другую кодировку, в которой у тебя документы и база данных)

    Если не поможет, напиши скрипт ещё раз уже поправленный, посмотрим.
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    А, самое прикольное, конечно, тут
    Код (Text):
    1. WHILE ($row=MYSQL_FETCH_ROW($result))
    2.  $number = "mysql_num_rows($result)";
    Это не так делается.
    Если тебе нужно одно найденное значение, то

    Код (Text):
    1. $row=array();
    2. if(mysql_num_rows($query)>0){
    3.   $row=mysql_fetch_row($result);
    4. }
    Если нужен список юзеров, у которых имя подходит по критерию поиска, то

    Код (Text):
    1. $userArray=array();
    2. while($rArr=mysql_fetch_array($result)){
    3.  $userArray[]=$rArr;
    4. }