За последние 24 часа нас посетили 18432 программиста и 1604 робота. Сейчас ищут 984 программиста ...

Предупреждение 1064

Тема в разделе "MySQL", создана пользователем dinyt, 16 янв 2014.

  1. dinyt

    dinyt Новичок

    С нами с:
    16 янв 2014
    Сообщения:
    2
    Симпатии:
    0
    Всем доброго времени суток.
    Столкнулся с такой проблемой (наверное, одна из самых избитых тем):
    "Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in ..."
    Я понимаю что загвоздка в запросе, но... Сижу уже 3-ий час и не могу найти причину. Помогите мне разобраться.

    Код (Text):
    1.  
    2.         ...
    3.         $con = mysqli_connect(_HOST, _USER, _PASSWORD, _DBNAME) or die("Error " . mysqli_error($con));
    4.         $con->query("SET NAMES utf8");
    5.  
    6.         $query = '';
    7.         if (($similar_game_1 != '') || ($similar_game_2 != '') || ($similar_game_3 != '') || ($similar_game_4 != '') || ($similar_game_5 != '') || ($similar_game_6 != ''))
    8.         {
    9.             $query .= (($similar_game_1 != '') ? ($similar_game_1.",") : "") .
    10.                 (($similar_game_2 != '') ? ($similar_game_2.",") : "") .
    11.                 (($similar_game_3 != '') ? ($similar_game_3.",") : "") .
    12.                 (($similar_game_4 != '') ? ($similar_game_4.",") : "") .
    13.                 (($similar_game_1 != '') ? ($similar_game_5.",") : "") .
    14.                 (($similar_game_1 != '') ? ($similar_game_6.",") : "");
    15.            
    16.             // убираем последний символ "запятую", если она имеет место быть
    17.             if ($query[strlen($query) - 1] == ",") $query[strlen($query) - 1] = "";
    18.  
    19.             $query = "SELECT GameID FROM Games WHERE GameNumber IN ( " . $query . " )";
    20.             echo BR, 'query: ', $query; // на экран выводится: SELECT GameID FROM `Games` WHERE GameNumber IN ( 16103,20733,427 )
    21.            
    22.             //$query = "SELECT GameID FROM `Games` WHERE GameNumber IN ( 16103,20733,427 )";
    23.             $result = $con->query($query);
    24.             echo BR, 'error mysql:', $con->errno; // здесь выводит 1064
    25.  
    26.             while ($row = mysqli_fetch_array($result))
    27.             {
    28.                 ...
    29.             }
    30.         }
    31.         $con->close();
    Данный скрипт выдает Warning на строке с циклом while.

    Если снять комментарий в строке:
    Код (Text):
    1. //$query = "SELECT GameID FROM `Games` WHERE GameNumber IN ( 16103,20733,427 )";
    и запустить скрипт, то предупреждения не выводится и скрипт отрабатывает.

    Тогда я решил передавать в конструкцию IN по одному значению - тоже не работает (это я о случае, когда строку запроса собираю динамически).
    Когда я вместо IN стал использовать просто "=", тогда запрос отработал.

    Подскажите, где я ошибаюсь?
    Благодарю за помощь.
     
  2. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    заменить на:
    Код (PHP):
    1. <?php
    2. echo BR, 'error mysql:', $con->error; 
    Добавлено спустя 1 минуту 59 секунд:
    Код (PHP):
    1. $con = mysqli_connect(_HOST, _USER, _PASSWORD, _DBNAME) or die("Error " . mysqli_error($con));
    Где вы это взяли? Это никогда не будет работать

    Добавлено спустя 2 минуты 6 секунд:
    Код (PHP):
    1. <?php
    2. $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    3.  
    4. /* check connection */
    5. if ($mysqli->connect_errno) {
    6.     printf("Connect failed: %s\n", $mysqli->connect_error);
    7.     exit();
    8. }
    9.  
    10. if (!$mysqli->query("SET a=1")) {
    11.     printf("Errormessage: %s\n", $mysqli->error);
    12. }
    13.  
    14. /* close connection */
    15. $mysqli->close();
    Добавлено спустя 2 минуты 1 секунду:
    http://ru2.php.net/mysqli_error
     
  3. dinyt

    dinyt Новичок

    С нами с:
    16 янв 2014
    Сообщения:
    2
    Симпатии:
    0
    Может это не совсем корректно, но тем не менее, это работает.
    Перед этим фрагментом кода у меня исполняются 5 других запросов и все выполняются.
    Загвоздка именно в этом запросе.

    Данная конструкция выведет мне сообщение об ошибке. Я его уже знаю :)
    вот оно: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"
    Я пытаюсь понять - в чем конкретно я ошибаюсь. Как я уже сказал - запрос простецкий, но почему то именно в скрипте он не отрабатывает.
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Выведи sql который ты отдаешь базе на экран и думай
     
  5. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    В том-то и дело что коннект к БД нужно инициализировать всего один раз.

    Это не относится к ваше проблеме, но тем не менее: это не работает
    Дело в том, что на момент вызова mysql_error($con) переменная $con ещё не определена, следует использовать mysqli_connect_error() без параметров.

    То что нужно сделать. Я, честно, подумал что у вас именно этот запрос и не работает (который в комментарии).
    Но, судя по-всему, проблема в том что у вас неправильно собирается SQL.
     
  6. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Для запроса
    Код (Text):
    1. http://example.com/test.php?game[similar][]=game1&game[similar][]=game2&game[similar][]=game3&game[similar][]=game4&game[similar][]=game5&game[similar][]=game6&game[similar][]=game7&
    Реализация mysqli
    Код (PHP):
    1. $con = mysqli_connect(_HOST, _USER, _PASSWORD, _DBNAME) or die("Error " . mysqli_connect_error());
    2.  
    3.  
    4. $games = $_GET['game']['similar'];
    5.  
    6. /* $games:
    7. Array (
    8.     [0] => game_1
    9.     [1] => game_2
    10.     [2] => game_3
    11.     [3] => game_4
    12.     [4] => game_5
    13.     [5] => game_6
    14.     [6] => game_7
    15. )
    16. */
    17.  
    18. // Шаблон запроса
    19. $sql = "SELECT GameId FROM Games WHERE GameNumber IN (%s)";
    20. $sql = sprintf($sql, implode(",", array_fill(0, count($games), '?')));
    21.  
    22. // SELECT GameId FROM Games WHERE GameNumber IN (?,?,?,?,?,?,?)
    23. echo $sql;
    24.  
    25. $stmt = mysqli_prepare($con,$sql) or die( mysqli_error($con) );
    26.  
    27. // Теперь нужно подставить вместо знаков вопроса значения.
    28. // Проще использовать PDO, т.к. там функция bind принимает массив
    29. // а mysqli_stmt_bind_param принимает значения как аргументы функции
    30.  
    31. $types = '';
    32. $values = array($stmt, &$types);
    33. foreach ($games as $key => $game){
    34.     // Необходимо для совместной работы call_user_func_array и mysqli_stmt_bind_param
    35.     $values[] = & $games[$key];
    36.     $types .= 's'; // Строка
    37. }
    38.  
    39. call_user_func_array('mysqli_stmt_bind_param', $values);
    40.  
    41. mysqli_stmt_bind_result($stmt, $game_id);
    42.  
    43. if (!mysqli_stmt_execute($stmt)){
    44.     die(mysqli_error($con));
    45. }
    46.  
    47. while (mysqli_stmt_fetch($stmt))
    48. {
    49.     var_dump($game_id);
    50. }
    Реализация PDO
    Код (PHP):
    1. $dsn = sprintf('mysql:dbname=%s;host=%s', _DBNAME, _HOST);
    2. $pdo = new PDO($dsn, _USER, _PASSWORD);
    3.  
    4. $games = $_GET['game']['similar'];
    5.  
    6. $sql = "SELECT GameId FROM Games WHERE GameNumber IN (%s)";
    7. $sql = sprintf($sql, implode(",", array_fill(0, count($games), '?')));
    8.  
    9. $stmt = $pdo->prepare($sql);
    10. $stmt->execute($games);
    11.  
    12. $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    13. print_r($result);