mysqli::query() can only execute one SQL statement.
Use mysqli::multi_query() when you want to run multiple SQL statements within one query.
mysqli::query
mysqli_query
(PHP 5)
mysqli::query -- mysqli_query — Exécute une requête sur la base de données
Description
Style orienté objet :
Style procédural :
Exécute une requête sur la base de données.
En termes de fonctionnalités, utiliser cette fonction revient à appeler mysqli_real_query() suivie de mysqli_use_result() ou mysqli_store_result().
Liste de paramètres
- link
-
Seulement en style procédural : Un identifiant de lien retourné par la fonction mysqli_connect() ou par la fonction mysqli_init()
- query
-
La requête, sous la forme d'une chaîne de caractères.
- resultmode
-
Soit la constante MYSQLI_USE_RESULT, soit la constante MYSQLI_STORE_RESULT, suivant le comportement désiré. Par défaut, la constante MYSQLI_STORE_RESULT est utilisé.
Si vous utilisez la constante MYSQLI_USE_RESULT, tous les appels suivants retourneront une erreur Commands out of sync tant que vous n'aurez pas appelé la fonction mysqli_free_result().
Avec la constante MYSQLI_ASYNC (disponible avec mysqlnd), il est possible de faire des requêtes asynchrone. mysqli_poll() est alors utilisé pour lire les résultats de ce type de requêtes.
Valeurs de retour
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec. Pour SELECT, SHOW, DESCRIBE ou EXPLAIN, mysqli_query() retournera un résultat sous la forme d'un objet.
Historique
| Version | Description |
|---|---|
| 5.3.0 | Ajout des requêtes asynchrones. |
Exemples
Exemple #1 Style orienté objet
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
printf("Échec de la connexion : %s\n", mysqli_connect_error());
exit();
}
/* "Create table" ne retournera aucun jeu de résultats */
if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
printf("Table myCity créée avec succès.\n");
}
/* Requête "Select" retourne un jeu de résultats */
if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) {
printf("Select a retourné %d lignes.\n", $result->num_rows);
/* Libération du jeu de résultats */
$result->close();
}
/* Si nous avons à récupérer beaucoup de données, nous utilisons MYSQLI_USE_RESULT */
if ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) {
/* Notez que nous ne pouvons exécuter aucune fonction qui agit sur le serveur tant que
le jeu de résultats est clos. Tous les appels retourneront un 'out of sync'
*/
if (!$mysqli->query("SET @a:='this will not work'")) {
printf("Erreur : %s\n", $mysqli->error);
}
$result->close();
}
$mysqli->close();
?>
Exemple #2 Style procédural
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
printf("Échec de la connexion : %s\n", mysqli_connect_error());
exit();
}
/* "Create table" ne retournera aucun jeu de résultats */
if (mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
printf("Table myCity créée avec succès.\n");
}
/* Requête "Select" retourne un jeu de résultats */
if ($result = mysqli_query($link, "SELECT Name FROM City LIMIT 10")) {
printf("Select a retourné %d lignes.\n", mysqli_num_rows($result));
/* Libération du jeu de résultats */
mysqli_free_result($result);
}
/* Si nous avons à récupérer beaucoup de données, nous utilisons MYSQLI_USE_RESULT */
if ($result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT)) {
/* Notez que nous ne pouvons exécuter aucune fonction qui agit sur le serveur tant que
le jeu de résultats est clos. Tous les appels retourneront un 'out of sync'
*/
if (!mysqli_query($link, "SET @a:='this will not work'")) {
printf("Erreur : %s\n", mysqli_error($link));
}
mysqli_free_result($result);
}
mysqli_close($link);
?>
L'exemple ci-dessus va afficher :
Table myCity créée avec succès. Select a retourné 10 lignes. Erreur : Commands out of sync; You can't run this command now
Voir aussi
- mysqli_real_query() - Exécute une requête SQL
- mysqli_multi_query() - Exécute une requête MySQL multiple
- mysqli_free_result() - Libère la mémoire associée à un résultat
mysqli::query
24-Nov-2008 03:54
27-Aug-2008 04:51
Translation:
"Couldn't fetch mysqli"
You closed your connection and are trying to use it again.
It has taken me DAYS to figure out what this obscure error message means...
01-Feb-2008 10:33
This may or may not be obvious to people but perhaps it will help someone.
When running joins in SQL you may encounter a problem if you are trying to pull two columns with the same name. mysqli returns the last in the query when called by name. So to get what you need you can use an alias.
Below I am trying to join a user id with a user role. in the first table (tbl_usr), role is a number and in the second is a text name (tbl_memrole is a lookup table). If I call them both as role I get the text as it is the last "role" in the query. If I use an alias then I get both as desired as shown below.
<?php
$sql = "SELECT a.uid, a.role AS roleid, b.role,
FROM tbl_usr a
INNER JOIN tbl_memrole b
ON a.role = b.id
";
if ($result = $mysqli->query($sql)) {
while($obj = $result->fetch_object()){
$line.=$obj->uid;
$line.=$obj->role;
$line.=$obj->roleid;
}
}
$result->close();
unset($obj);
unset($sql);
unset($query);
?>
In this situation I guess I could have just renamed the role column in the first table roleid and that would have taken care of it, but it was a learning experience.
15-May-2007 10:42
When building apps, i like to see the whole statement when if fails.
<?php
$q="SELECT somecolumn FROM sometable"; //some instruction
$r=mysqli_query($DBlink,$q) or die(mysqli_error($DBlink)." Q=".$q);
?>
If theres an error (like my numerous typing mistakes) this shows the entire instruction.
Good for development (not so good on production servers - simply find and replace when finished: $r=mysqli_query($DBlink,$q); )
Hope it helps. Jon
12-Mar-2007 07:55
this is a variant of mysqli_query that returns output parameters as a rowset.
<?php
function mysqli_exec($link, $command)
{
$select = '';
$i2 = 0;
while (true)
{
$i1 = strpos($command, '@', $i2);
if ($i1 === false)
break;
$field = '';
$i2 = $i1 + 1;
while ($i2 < strlen($command) &&
($command[$i2] >= '0' && $command[$i2] <= '9') ||
($command[$i2] >= 'A' && $command[$i2] <= 'Z') ||
($command[$i2] >= 'a' && $command[$i2] <= 'z') ||
($command[$i2] == '_'))
$i2++;
$field = substr($command, $i1 + 1, $i2 - $i1 - 1);
if (strlen($select) == 0)
$select = "select @{$field} as $field";
else
$select = $select . ", @{$field} as $field";
}
if (strlen($select) > 0)
{
mysqli_query($link, $command);
return mysqli_query($link, $select);
}
else
return mysqli_query($link, $command);
}
?>
an example:
<?php
$link = mysqli_connect('localhost', 'myusr', 'mypass') or die ('Error connecting to mysql: ' . mysqli_error($link));
mysqli_select_db($link, 'clips');
$user_name = 'test';
$result = mysqli_exec($link, "call do_user_login('$user_name', @session_id, @msg)");
while ($row = mysqli_fetch_assoc($result))
{
echo "session_id : {$row['session_id']} <br>";
echo "msg : {$row['msg']} <br>";
}
?>
08-May-2006 01:12
Calling Stored Procedures
Beeners' note/example will not work. Use mysqli_multi_query() to call a Stored Procedure. SP's have a second result-set which contains the status: 'OK' or 'ERR'. Using mysqli_query will not work, as there are multiple results.
<?php
$sQuery="CALL SomeSP('params')";
if(!mysqli_multi_query($sqlLink,$sQuery)) {
// your error handler
}
$sqlResult=mysqli_store_result($sqlLink);
if(mysqli_more_results($this->sqlLink))//Catch 'OK'/'ERR'
while(mysqli_next_result($this->sqlLink));
?>
You will have to rewrite/expand this a bit for more usability of course, but it's just an example.
08-Jan-2006 09:16
Stored Procedures.
Use mysqli_query to call a stored procedure that returns a result set.
Here is a short example:
<?php
$mysqli = new mysqli(DBURI,DBUSER,DBPASS,DBNAME);
if (mysqli_connect_errno())
{
printf("Connection failed: %s\n", mysqli_connect_error());
exit();
}
$SQL = "CALL my_procedure($something)";
if ( ($result = $mysqli->query($SQL))===false )
{
printf("Invalid query: %s\nWhole query: %s\n", $mysqli->error, $SQL);
exit();
}
while ($myrow = $result->fetch_array(MYSQLI_ASSOC))
{
$aValue[]=$myrow["a"];
$bValue[]=$myrow["b"];
}
$result->close();
$mysqli->close();
?>
I hope this saves someone some time.
07-Aug-2005 09:03
WARNING: This function was buggy on 64bit machines till 5.0.5. Affected versions 5.0.0-5.0.4. The problem appears when a value for the third parameter is passed - this will lead to instant FALSE returned by the function. Therefore if you need to use unbuffered query don't use this function with the aforementioned versions but you mysqli_real_query() and mysqli_use_result().
If you have the rights to patch you PHP installation the fix is easy:
In file ext/mysqli/myslqi_nonapi.c, function PHP_FUNCTION(mysqli_query)
change
unsigned int resultmode=0;
to
unsigned long resultmode=0;
Thanks!
13-Aug-2004 11:24
Use difference collation/character for connect, result.
You can set the collation before your query.
E.g. want to set the collation to utf8_general_ci
you can send the query "SET NAMES 'utf8'" first
<?php
$mysqli=new mysqli('localhost', 'root', 'password', 'test');
$mysqli->query("SET NAMES 'utf8'");
$q=$mysqli->query("select * from test");
while($r=$q->fetch_assoc()) {
print_r($r);
}
?>
There are many variables about character settings.
By running sql command, SHOW VARIABLES LIKE 'char%';
There are some variables control the character usage.
character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server
character_set_system
Also SET NAMES can repalce with one or some settings like SET character_set_results='utf8';
