Всем доброго времени суток. Столкнулся с такой проблемой (наверное, одна из самых избитых тем): "Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in ..." Я понимаю что загвоздка в запросе, но... Сижу уже 3-ий час и не могу найти причину. Помогите мне разобраться. Код (Text): ... $con = mysqli_connect(_HOST, _USER, _PASSWORD, _DBNAME) or die("Error " . mysqli_error($con)); $con->query("SET NAMES utf8"); $query = ''; if (($similar_game_1 != '') || ($similar_game_2 != '') || ($similar_game_3 != '') || ($similar_game_4 != '') || ($similar_game_5 != '') || ($similar_game_6 != '')) { $query .= (($similar_game_1 != '') ? ($similar_game_1.",") : "") . (($similar_game_2 != '') ? ($similar_game_2.",") : "") . (($similar_game_3 != '') ? ($similar_game_3.",") : "") . (($similar_game_4 != '') ? ($similar_game_4.",") : "") . (($similar_game_1 != '') ? ($similar_game_5.",") : "") . (($similar_game_1 != '') ? ($similar_game_6.",") : ""); // убираем последний символ "запятую", если она имеет место быть if ($query[strlen($query) - 1] == ",") $query[strlen($query) - 1] = ""; $query = "SELECT GameID FROM Games WHERE GameNumber IN ( " . $query . " )"; echo BR, 'query: ', $query; // на экран выводится: SELECT GameID FROM `Games` WHERE GameNumber IN ( 16103,20733,427 ) //$query = "SELECT GameID FROM `Games` WHERE GameNumber IN ( 16103,20733,427 )"; $result = $con->query($query); echo BR, 'error mysql:', $con->errno; // здесь выводит 1064 while ($row = mysqli_fetch_array($result)) { ... } } $con->close(); Данный скрипт выдает Warning на строке с циклом while. Если снять комментарий в строке: Код (Text): //$query = "SELECT GameID FROM `Games` WHERE GameNumber IN ( 16103,20733,427 )"; и запустить скрипт, то предупреждения не выводится и скрипт отрабатывает. Тогда я решил передавать в конструкцию IN по одному значению - тоже не работает (это я о случае, когда строку запроса собираю динамически). Когда я вместо IN стал использовать просто "=", тогда запрос отработал. Подскажите, где я ошибаюсь? Благодарю за помощь.
заменить на: Код (PHP): <?php echo BR, 'error mysql:', $con->error; Добавлено спустя 1 минуту 59 секунд: Код (PHP): $con = mysqli_connect(_HOST, _USER, _PASSWORD, _DBNAME) or die("Error " . mysqli_error($con)); Где вы это взяли? Это никогда не будет работать Добавлено спустя 2 минуты 6 секунд: Код (PHP): <?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); /* check connection */ if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } if (!$mysqli->query("SET a=1")) { printf("Errormessage: %s\n", $mysqli->error); } /* close connection */ $mysqli->close(); Добавлено спустя 2 минуты 1 секунду: http://ru2.php.net/mysqli_error
Может это не совсем корректно, но тем не менее, это работает. Перед этим фрагментом кода у меня исполняются 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" Я пытаюсь понять - в чем конкретно я ошибаюсь. Как я уже сказал - запрос простецкий, но почему то именно в скрипте он не отрабатывает.
В том-то и дело что коннект к БД нужно инициализировать всего один раз. Это не относится к ваше проблеме, но тем не менее: это не работает Дело в том, что на момент вызова mysql_error($con) переменная $con ещё не определена, следует использовать mysqli_connect_error() без параметров. То что нужно сделать. Я, честно, подумал что у вас именно этот запрос и не работает (который в комментарии). Но, судя по-всему, проблема в том что у вас неправильно собирается SQL.
Для запроса Код (Text): 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): $con = mysqli_connect(_HOST, _USER, _PASSWORD, _DBNAME) or die("Error " . mysqli_connect_error()); $games = $_GET['game']['similar']; /* $games: Array ( [0] => game_1 [1] => game_2 [2] => game_3 [3] => game_4 [4] => game_5 [5] => game_6 [6] => game_7 ) */ // Шаблон запроса $sql = "SELECT GameId FROM Games WHERE GameNumber IN (%s)"; $sql = sprintf($sql, implode(",", array_fill(0, count($games), '?'))); // SELECT GameId FROM Games WHERE GameNumber IN (?,?,?,?,?,?,?) echo $sql; $stmt = mysqli_prepare($con,$sql) or die( mysqli_error($con) ); // Теперь нужно подставить вместо знаков вопроса значения. // Проще использовать PDO, т.к. там функция bind принимает массив // а mysqli_stmt_bind_param принимает значения как аргументы функции $types = ''; $values = array($stmt, &$types); foreach ($games as $key => $game){ // Необходимо для совместной работы call_user_func_array и mysqli_stmt_bind_param $values[] = & $games[$key]; $types .= 's'; // Строка } call_user_func_array('mysqli_stmt_bind_param', $values); mysqli_stmt_bind_result($stmt, $game_id); if (!mysqli_stmt_execute($stmt)){ die(mysqli_error($con)); } while (mysqli_stmt_fetch($stmt)) { var_dump($game_id); } Реализация PDO Код (PHP): $dsn = sprintf('mysql:dbname=%s;host=%s', _DBNAME, _HOST); $pdo = new PDO($dsn, _USER, _PASSWORD); $games = $_GET['game']['similar']; $sql = "SELECT GameId FROM Games WHERE GameNumber IN (%s)"; $sql = sprintf($sql, implode(",", array_fill(0, count($games), '?'))); $stmt = $pdo->prepare($sql); $stmt->execute($games); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result);