mysqli várias consultas - variável conjunto produz erro boolean / como ignorar isso?
-
22-07-2019 - |
Pergunta
Got a seguinte consulta simples que funciona bem através do phpMyAdmin, mas quando eu adicioná-lo para o meu site php nenhum resultado for retornado e nenhum erro / mensagens de aviso também. Se eu remover "JOGO @ N = -1;" em seguida, ele funciona bem.
<?php
$db_connect = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, true);
mysql_select_db(DB_NAME, $db_connect);
$test_query = mysql_query("SET @N=-1;SELECT `id`, (@N:=@N+1) AS `mycount` FROM `mydb`;");
for ($i = 0; $i <= mysql_num_rows($test_query)-1; $i++) {
echo mysql_result($db_directorymap, $i, 0) . " " . mysql_result($db_directorymap, $i, 1) . "<br />";
}
?>
UPDATE: Acabei de me mudar para mysqli, mas é claro que eu ainda estou tendo um problema com a declaração mysql e mysqli_multi_query. Parece que quando ele é executado a primeira parte da consulta os resultados retornados estão vazias, assim, um erro de boolean é dado. Eu estou supondo que eu tenho que pular o primeiro conjunto de resultados, mas eu não sei como fazer isso?
Solução
É porque a função mysql_query
só aceitará uma consulta, mas você deu-lhe dois, separados por um ponto e vírgula. Tente qualquer um:
-
A execução de cada consulta separadamente (não sei se isso vai funcionar):
mysql_query( "SET @N=-1" ); mysql_query( "SELECT `id`, (@N:=@N+1) AS `mycount` FROM `mydb`" );
-
Usando mysqli com o multi_query (ou um DOP equivalente, se houver).
Para responder à sua pergunta atualização: verifique a página de manual do PHP para multi_query. Eu acho que você vai querer usar mysqli::next_result
. Algo parecido com isto, usando o estilo de procedimento:
mysqli_multi_query($link, $query);
mysqli_next_result($link);
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
mysqli_free_result($result);
}
Outras dicas
Várias consultas via mysql_query não são suportados, então eu acho que isso é só executar o comando SET, e não o comando SELECT subseqüente.