@uranus235

Почему не выполняется запрос mysqli?

Вот имеется такой код:

$result = $mysqli->query("SELECT * FROM users WHERE social_id='$social_id'", MYSQLI_USE_RESULT);
	$num = $result->num_rows;
	
	if($num > 0){
		тут устанавливаются куки
	}else{
		$aquery = $mysqli->query("INSERT INTO users (social_id) VALUES ('$social_id')", MYSQLI_USE_RESULT) or die(mysqli_error($mysqli));
		
		if($aquery){
		   echo "okay";
		}else{
		   echo "oops";
		}
		
	}


При выполнении кода возвращается "Commands out of sync: you can't run this command now". Пытался погуглить, ничего не нашел :( Пожалуйста, объясните в чем проблема (только только начинаю изучать mysqli)
  • Вопрос задан
  • 2628 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Нельзя выполнить подряд два запроса с MYSQLI_USE_RESULT. Необходимо сначала закрыть первый запрос через $result->free(). В вашем случае, если данные по запросу дальше не используются, то лучше использовать не num_rows, а COUNT(*).
Ответ написан
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Потому, что вы подготовили результирующий набор но не использовали. Перед следующим запросом поставьте free_result()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Проблема в пихании в код разных умных слов без понимания их смысла.
Если убрать из кода слово MYSQLI_USE_RESULT, то волшебным образом ошибка исчезнет.
Впрочем, я должен признать, что сермяжная правда в двух других ответах есть. Если последовать моему же совету, и использовать prepare/execute вместо query (поскольку эта парочка используе USE_RESULT без вариантов), то как раз и придется либо выбирать все данные, которые вернул запрос, либо освобождать ресурс через free(), либо перед выборкой дергать store_result().
Но - повторюсь - в текущем коде этот параметр не имеет смысла и в то же время является причиной всех бед.

Но проблемы этого кода на этом только начнутся.

Во-первых, НИКОГДА больше пиши так: die(mysqli_error($mysqli)); а то станешь козленочком и тебя заберут в армию.
Вместо die надо писать trigger_error()

Во-вторых, НИКОГДА не подставляй переменные напрямую в строку запроса. Передавать данные надо только через плейсхолдеры. Если родной механизм слешком сложный, то можешь воспользоваться библиотекой phpfaq.ru/safemysql и код получится таким.
$exists = $db->getOne("SELECT 1 FROM users WHERE social_id=?s",$social_id);
if($exists){
	//тут устанавливаются куки
}else{
	$db->query("INSERT INTO users (social_id) VALUES (?s)", $social_id); 
}

(выводить бессмысленные okay или oops не нужно)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы