Mysqli query result error

(PHP 5, PHP 7, PHP 8)

mysqli_query

(PHP 5, PHP 7, PHP 8)

mysqli::querymysqli_query
Выполняет запрос к базе данных

Описание

Объектно-ориентированный стиль

public mysqli::query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

mysqli_query(mysqli $mysql, string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

Для не DML-запросов (не INSERT, UPDATE или DELETE),
эта функция равносильна вызову
функции mysqli_real_query(), а затем
mysqli_use_result() или
mysqli_store_result().

Замечание:

В случае, если длина выражения, которое передаётся в
mysqli_query(), больше, чем
max_allowed_packet сервера, возвращаемые коды ошибки могут
различаться в зависимости от используемого драйвера. А это может быть либо
родной MySQL драйвер (mysqlnd), либо клиентская библиотека
MySQL (libmysqlclient). Поведение функции будет следующим:

  • mysqlnd на платформе Linux возвращает код ошибки 1153.
    Сообщение об ошибке означает размер пакета превышает
    max_allowed_packet байт
    .

  • mysqlnd на платформе Windows возвращает код ошибки 2006.
    Это сообщение об ошибке означает отказ сервера.

  • libmysqlclient на всех платформах возвращает код ошибки 2006.
    Это сообщение об ошибке означает отказ сервера.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, полученный с помощью
mysqli_connect() или mysqli_init().

query

Текст запроса.

Внимание

Предупреждение безопасности: SQL-инъекция

Если запрос содержит какие-либо входные переменные, вместо этого следует
использовать подготавливаемые запросы.
В качестве альтернативы данные должны быть правильно отформатированы
и все строки должны быть экранированы с помощью функции mysqli_real_escape_string().

result_mode

Режим результата может быть одной из 3 констант, указывающих,
как результат будет возвращён сервером MySQL.

MYSQLI_STORE_RESULT (по умолчанию) — возвращает объект
mysqli_result с буферизованным набором результатов.

MYSQLI_USE_RESULT — возвращает объект
mysqli_result с небуферизованным набором результатов.
Пока есть отложенные записи, ожидающие выборки, линия соединения будет занята
и все последующие вызовы будут возвращать ошибку Commands out of sync.
Чтобы избежать ошибки, все записи должны быть получены с сервера или набор результатов должен быть отброшен путём вызова mysqli_free_result().

MYSQLI_ASYNC (доступно с mysqlnd) — запрос выполняется асинхронно, набор результатов сразу не возвращается.
Затем используется mysqli_poll() для получения результатов по этим запросам.
Используется в сочетании с константой
MYSQLI_STORE_RESULT или
MYSQLI_USE_RESULT.

Возвращаемые значения

Возвращает false в случае возникновения ошибки. В случае успешного выполнения запросов,
которые создают набор результатов, таких как SELECT, SHOW, DESCRIBE или
EXPLAIN, mysqli_query() вернёт объект mysqli_result.
Для остальных успешных запросов mysqli_query() вернёт true.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась,
выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT,
вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::query()

Объектно-ориентированный стиль


<?php

mysqli_report

(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* Создание таблицы, не возвращает набор результатов */
$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");
printf("Таблица myCity создана.n");/* Запросы SELECT, возвращают набор результатов */
$result = $mysqli->query("SELECT Name FROM City LIMIT 10");
printf("Запрос SELECT вернул %d строк.n", $result->num_rows);/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
$result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT);/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем набор результатов. Все подобные вызовы
будут вызывать ошибку 'out of sync' */
$mysqli->query("SET @a:='this will not work'");

Процедурный стиль


<?php

mysqli_report

(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");/* Создание таблицы, не возвращает набор результатов */
mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
printf("Таблица myCity создана.n");/* Запросы SELECT, возвращают набор результатов */
$result = mysqli_query($link, "SELECT Name FROM City LIMIT 10");
printf("Запрос SELECT вернул %d строк.n", mysqli_num_rows($result));/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
$result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT);/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем набор результатов. Все подобные вызовы
будут вызывать ошибку 'out of sync' */
mysqli_query($link, "SET @a:='this will not work'");

Результат выполнения данных примеров:

Таблица myCity создана.
Запрос SELECT вернул 10 строк.

Fatal error: Uncaught mysqli_sql_exception: Commands out of sync; you can't run this command now in...

Смотрите также

  • mysqli_real_query() — Выполнение SQL запроса
  • mysqli_multi_query() — Выполняет один или несколько запросов к базе данных
  • mysqli_prepare() — Подготавливает SQL выражение к выполнению
  • mysqli_free_result() — Освобождает память, занятую результатами запроса

NUNTIUS

15 years ago


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.


xa at sagexa dot com

4 months ago


"In PHP 8.1, the default error handling behavior of the MySQLi extension has changed from silencing errors to throw an Exception on errors. "
This is true even for the procedural use of mysqli, i.e. mysqli_query.
Hence, using if(!mysqli_query($c, $sql)) [...] is pointless.
To disable Exception throwing : mysqli_report(MYSQLI_REPORT_OFF);

theyranos at gmail dot com

11 years ago


The cryptic "Couldn't fetch mysqli" error message can mean any number of things, including:

1. You're trying to use a database object that you've already closed (as noted by ceo at l-i-e dot com). Reopen your database connection, or find the call to <?php mysqli_close($db); ?> or <?php $db->close(); ?> and remove it.
2. Your MySQLi object has been serialized and unserialized for some reason. Define a wakeup function to re-create your database connection. http://php.net/__wakeup
3. Something besides you closed your mysqli connection (in particular, see http://bugs.php.net/bug.php?id=33772)
4. You mixed OOP and functional calls to the database object. (So, you have <?php $db->query() ?> in the same program as <?php mysqli_query($db) ?>).


petrus.jvr

11 years ago


When calling multiple stored procedures, you can run into the following error: "Commands out of sync; you can't run this command now".
This can happen even when using the close() function on the result object between calls.
To fix the problem, remember to call the next_result() function on the mysqli object after each stored procedure call. See example below:

<?php
// New Connection
$db = new mysqli('localhost','user','pass','database');// Check for errors
if(mysqli_connect_errno()){
echo
mysqli_connect_error();
}
// 1st Query
$result = $db->query("call getUsers()");
if(
$result){
    
// Cycle through results
   
while ($row = $result->fetch_object()){
       
$user_arr[] = $row;
    }
   
// Free result set
   
$result->close();
   
$db->next_result();
}
// 2nd Query
$result = $db->query("call getGroups()");
if(
$result){
    
// Cycle through results
   
while ($row = $result->fetch_object()){
       
$group_arr[] = $row;
    }
    
// Free result set
    
$result->close();
    
$db->next_result();
}
else echo(
$db->error);// Close connection
$db->close();
?>


Anonymous

4 years ago


Here is an example of a clean query into a html table

<table>
   <tr>
     <th>First Name</th>
     <th>Last Name</th>
     <th>City</th>
   </tr>
   <?php while ($row = $myquery->fetch_assoc()) { ?>
   <tr>
     <td><?php echo $row["firstname"]; ?></td>
     <td><?php echo $row["lastname"]; ?></td>
     <td><?php echo $row["city"];?></td>
   </tr>
   <?php } ?>
</table>


registrations at jdfoxmicro dot com

12 years ago


I like to save the query itself in a log file, so that I don't have to worry about whether the site is live.

For example, I might have a global function:

<?php

function UpdateLog ( $string , $logfile )  {

  
$fh = fopen ( $logfile , 'a' );

  
$fwrite ( $fh , strftime ('%F %T %z')." ".$string."n";

  
fclose ( $fh );

}

?>



Then in my mysql function error trapper, something like this:

<?php

   $error_msg
= "Database error in [page].php / ";

  
$error_msg .= mysqli_error ( $link )." / ";

  
$error_msg .= $query;

  
UpdateLog ( $error_msg , DB_ERROR_LOG_FILE );

?>



I also include the remote IP, user agent, etc., but I left it out of these code samples.  And have it e-mail me when an error is caught, too.

Jeff


Beeners

17 years ago


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: %sn", mysqli_connect_error());
  exit();
}
$SQL = "CALL my_procedure($something)";
if ( (
$result = $mysqli->query($SQL))===false )
{
 
printf("Invalid query: %snWhole query: %sn", $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.


ceo at l-i-e dot com

14 years ago


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...


jcwebb at dicoe dot com

15 years ago


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


info at ff dot net

16 years ago


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.


Igor

14 years ago


mysqli::query() can only execute one SQL statement.

Use mysqli::multi_query() when you want to run multiple SQL statements within one query.


hunreal at gmail dot com

18 years ago


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';


thomas dekker

12 years ago


Building inserts can be annoying. This helper function inserts an array into a table, using the key names as column names:

<?php
 
private function store_array (&$data, $table, $mysqli)
  {
   
$cols = implode(',', array_keys($data));
    foreach (
array_values($data) as $value)
    {
      isset(
$vals) ? $vals .= ',' : $vals = '';
     
$vals .= '''.$this->mysql->real_escape_string($value).''';
    }
   
$mysqli->real_query('INSERT INTO '.$table.' ('.$cols.') VALUES ('.$vals.')');
  }
?>

Adapt it to your specific needs.


ahmed dot 3abdolah at gmail dot com

8 years ago


Hi, i created function that add  a new table using array , i work with it on my projects ...
<?PHP
                  
/* this function was learned from PHP.net */
function array_keys_exist(&$key,array &$array){
               
$keys = split("|",$key);
                foreach(
$keys as $key_s){
                    if(
array_key_exists($key_s, $array)) return true;
                    }
                return
false;
            }
/*and this is my function */
array_create_table(array &$array){
        if(
is_array($array)){
          
$key = "table|rows|values";   
       
$info = "";
        if(
array_keys_exist($key,$array)){
        if(
is_array($array["rows"]) and is_array($array["values"]) ){

                                                     if(

count($array["rows"]) == count($array["values"])) {
                        for(
$i=0; $i<=count($array["rows"]); $i++){
   
$info = $info." ".$array["rows"][$i]." ".$array["values"][$i]." NOT NULL ";
            if(
$i < count($array["rows"])-1 ) $info = $info.",";
                    }
   
$query = "CREATE TABLE ".$this->private_tables_name.$array["table"]." ";
   
$query .= "( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, ".$info." )";
                    return
$query;   
                        }
                        }
                }else return
"Error";
                    }
            }
/* the use is simple */
$database = new database(); // connection to database i used mysqli ...
$array = array("table"=>"MRO", "rows"=>array("name","username") , "values" => array("VARCHAR (50) "," VARCHAR (50) ") );$query = array_create_table($array); // convert and create the query ...
if($database->query($query)) echo "Work"; else echo "Error"; // result : work?>

marcus at synchromedia dot co dot uk

11 years ago


The exact type returned by a successful query is mysqli_result.

popere dot noel at yahoo dot com

9 years ago


or you could just extend the class...
in my case i already had a wraper for the db so something like this was easy :

public function  free($result) {

    $result->free_result();
$this->link->next_result();
}

just tried it and it works like a charm ;-)


omidbahrami1990 at gmail dot com

5 years ago


This Is A Secure Way To Use mysqli::query
--------------------------------------------------------
<?php
function secured_query($sql)
{
$connection = new mysqli($host,$username,$password,$name);

    if (

$connection->connect_error)
die(
"Secured");$result=$connection->query($sql);
if(
$result==FALSE)
die(
"Secured");$connection->close();       
return
$result;   
}
/*
$host ---> DataBase IP Address
$username ---> DataBase Username
$password ---> DataBase Password
$name ---> DataBase Name
*/
?>

blinki bill, argodak at yahoo dot com

9 years ago


Recently I had puzzling problem when performing DML queries, update in particular, each time a update query is called and then there are some more queries to follow this error will show on the page and go in the error_log:
"Fatal error:  Exception thrown without a stack frame in Unknown on line 0"

The strange thing is that all queries go through just fine so it didn't make much sense:

$update = mysqli_query($connection, $query_string);
if(!$update){
echo 'Houston we have a problem '.mysqli_error($connection);
exit;
}

In the above example "$update" is "true", mysqli_error() is empty and of course the update operation goes through, however the nasty super cryptic error appears on the page.
What makes even less sense to me is how I fixed it - just called "mysqli_free_result" after the update query and the problem was gone, however because mysqli_free_result is not supposed to be called after DML queries (to free what, a boolean? lol) it needs to be wrapped in a try catch block:

try{
mysqli_free_result($update);
}catch (Exception $e){
//do nothing
}

So, I don't know why but it seems that when DML queries are responsible for:
"Fatal error:  Exception thrown without a stack frame in Unknown on line 0"
calling "mysqli_free_result" after the query seems to be fixing the issue


Anonymous

5 years ago


I don't know is it bug or something , then first I write it here . Query SHOW with MYSQLI_USE_RESULT option don't show num_rows :
<?php
SHOW TABLES LIKE
[some table], MYSQLI_USE_RESULT
num_rows
// shows 0 !
?>

David Marcus

5 years ago


If you use the default resultmode of MYSQLI_STORE_RESULT, you can call $mysqli->close() right after $mysqli->query and before you use mysqli_result. This reduces the time the connection is open, which can help if the database server has a limit on how many connections there can be.


<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");/* проверка соединения */
if ($mysqli->connect_errno) {
    
printf("Не удалось подключиться: %sn"$mysqli->connect_error);
    exit();
}
/* Создание таблицы не возвращает результирующего набора */
if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
    
printf("Таблица myCity успешно создана.n");
}
/* Select запросы возвращают результирующий набор */
if ($result $mysqli->query("SELECT Name FROM City LIMIT 10")) {
    
printf("Select вернул %d строк.n"$result->num_rows);/* очищаем результирующий набор */
    
$result->close();
}
/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
if ($result $mysqli->query("SELECT * FROM City"MYSQLI_USE_RESULT)) {/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
       с сервером, пока не закроем результирующий набор. Все подобные вызовы
       будут вызывать ошибку 'out of sync' */
    
if (!$mysqli->query("SET @a:='this will not work'")) {
        
printf("Ошибка: %sn"$mysqli->error);
    }
    
$result->close();
}
$mysqli->close();
?>


<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %sn"mysqli_connect_error());
    exit();
}
/* Создание таблицы не возвращает результирующего набора */
if (mysqli_query($link"CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
    
printf("Таблица myCity успешно создана.n");
}
/* Select запросы возвращают результирующий набор */
if ($result mysqli_query($link"SELECT Name FROM City LIMIT 10")) {
    
printf("Select вернул %d строк.n"mysqli_num_rows($result));/* очищаем результирующий набор */
    
mysqli_free_result($result);
}
/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
if ($result mysqli_query($link"SELECT * FROM City"MYSQLI_USE_RESULT)) {/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
       с сервером, пока не закроем результирующий набор. Все подобные вызовы
       будут вызывать ошибку 'out of sync' */
    
if (!mysqli_query($link"SET @a:='this will not work'")) {
        
printf("Ошибка: %sn"mysqli_error($link));
    }
    
mysqli_free_result($result);
}
mysqli_close($link);
?>

Таблица myCity успешно создана.
Select вернул 10 строк.
Ошибка: Commands out of sync;  You can't run this command now
  1. PHP MySQLi Error Functions
  2. Conclusion

Display Errors Using MySQLi Error Functions

MySQLi is a PHP function used to access the MySQL database server. You can use this extension if you have MySQL version 4.1.13 or above.

There are various MySQLi functions that you can use to perform different functions in PHP. In this article, we will learn MySQLi error functions.

We will also see how and where to use code examples and observe the outputs. For this tutorial, we will use MySQL version 8.0.27 and PHP version 7.4.1.

PHP MySQLi Error Functions

In this tutorial, we will learn about the following PHP MySQLi error functions:

  • mysqli_error()
  • mysqli_errno()
  • mysqli_error_list()
  • mysqli_connect_error()
  • mysqli_connect_errno()

All these functions can be used in object-oriented style and procedural style. Let’s understand both syntax using the mysqli_error() function.

Syntax of mysqli_error() Function in Object Oriented Style

Syntax of mysqli_error() Function in Procedural Style

string mysqli_error ( mysqli $link )

mysqli_error() Function in MySQL

This function is used to output the last error description for the most recent function call (if there is any). It is used when you want to know whether the SQL query has an error or not.

mysqli_error() returns the error description and empty string if there is no error. See the following example.

Example Code Using Procedural Style:

<?php
    $host = "localhost";
    $username = "root";
    $password = "";
    $database = "person";

    $connection = mysqli_connect($host, $username, $password, $database) 
    or die("Connection Failed"); 

    $sql = "SELECT * FROM teacher";
    $result = mysqli_query($connection, $sql);
    $error_message = mysqli_error($connection);

    if($error_message == ""){
        echo "No error related to SQL query.";
    }else{
        echo "Query Failed: ".$error_message;
    }
    mysqli_close($connection);
?>

The code given above tries to make the connection using $host, $username, $password, $database variables and save this connection into the $connection variable.

mysqli_error() function will take this connection variable $connection as a parameter and check if there is any error caused by the recent MySQLi function call which is mysqli_query($connection, $sql) here.

Output:

display errors using mysqli error functions - no error using mysqli_error

Now, change the table name in the SQL query from teacher to person and observe the output given below.

Output:

display errors using mysqli error functions - error using mysqli_error

We, as a developer, can easily understand that there is no person table in the person database (this is what it means in the above error).

Keep the table name changed and replace the line $error_message = mysqli_error($connection); with $error_message = $connection->error; to practice and understand the object oriented style using MySQLi error function.

mysqli_errno() Function in MySQL

mysqli_errno() works the same as mysqli_error() does, but it will return the error code instead of the error description.

Write the following code to practice and understand. You may have noticed that we use a procedural style to practice this function.

<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";

     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 

     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_errno($connection);

     if($error_message == ""){
     	echo "No error related to SQL query.";
     }else{
     	echo "Query Failed: ".$error_message;
     }
    mysqli_close($connection);
?>

The code given above will show the following output where you will see a number as an error code.

Output:

display errors using msyqli error functions - error using mysqli_errno

The question is, why do we use this function to show the numbers only? Because if you want to print a user-friendly error message (custom message), you can use this error code in if-else statements.

See the following code and its output below.

<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";

     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 

     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_errno($connection);

     if($error_message == 1146){
     	echo "You are trying to read the data from a table which doesn't exist in your 			database "."'".$database."'";
     }
    mysqli_close($connection);
?>

Output:

display errors using mysqli error functions - custom error message using mysqli_errno.png

mysqli_error_list() Function in MySQL

This function is very useful for knowing the error code, SQL state, and error description because this function returns an array containing all the necessary information.

Example Code:

<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";

     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 

     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     print_r(mysqli_error_list($connection));
     mysqli_close($connection);
?>

Output:

display errors using mysqli error functions - error list using mysqli_error_list

mysqli_connect_error() Function in MySQL

mysqli_connect_error() returns the error description from the last connection if there is any. Although, the die() function also tell about the unsuccessful connection but mysqli_connect_error() returns the error that we can understand easily.

Write the following code first, see its output, and then we’ll compare it with the output produced by mysqli_connect_error().

<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";

     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 

     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_error($connection);

     if($error_message != ""){
     	echo "Query Failed: ".$error_message;
      }
    mysqli_close($connection);
?>

Output:

display errors using mysqli error functions - error using mysqli_connect_error part a

See the output given above; you can see that the error we can understand is somewhere in the middle.

Imagine, if you have 2 or 3 errors, it would not be easy to find out. Now, use the mysqli_connect_error() and see the difference using the following code and output.

<?php
     $host = "localhost";
     $username = "newroot";
     $password = "";
     $database = "person";

     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed: ".mysqli_connect_error()); 

     $sql = "SELECT * FROM teacher";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_error($connection);

     if($error_message != ""){
     	echo "SQL Query Failed: ".$error_message;
    }
    mysqli_close($connection);
?>

Output:

display errors using mysqli error functions - error using mysqli_connect_error part b

The above output clearly says that there is no user named newroot, which does not allow you to access the database.

mysqli_connect_errno() Function in MySQL

This function behaves like mysqli_connect_error() but displays the error code rather than the error message. We can use this error code to write custom error messages.

Example Code:

<?php
     $host = "localhost";
     $username = "newroot";
     $password = "";
     $database = "person";

     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed: ".mysqli_connect_errno()); 

     $sql = "SELECT * FROM teacher";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_error($connection);

     if($error_message != ""){
	     echo "SQL Query Failed: ".$error_message;
     }
     mysqli_close($connection);
?>

Output:

display errors using mysqli error functions - error using mysqli_connect_errno

Conclusion

Considering all the discussion and examples, we have concluded two main categories. The first category shows the errors about SQL queries and the other about database connections.

Depending on the project needs, we can print the error message or the error code in each category.

Правильная обработка ошибок позволяет сделать стабильное приложение, которое не будет завершаться неожиданно. В случае возникновения непредвиденной ситуации программа должна выдавать вменяемый ответ, почему она не хочет исполнится. И создание правильного механизма обработки ошибок — это задача программиста.

В этой статье рассмотрим два вида ошибок, которые могут возникнуть при программировании взаимодействия с базой данных. Первый тип — это ошибка подключения к базе данных. Второй тип — это ошибка выполнения запроса к базе данных. Для обработки этих ошибок будем использовать специальные функции для работы с базой.

Ошибка соединения с базой данных

Сразу приведём пример обработки ошибки с соединением с базой данных:

<?php 
   $host = 'localhost'; // адрес сервера
   $db_name = 'database'; // имя базы данных
   $user = 'user'; // имя пользователя
   $password = 'password'; // пароль

   // создание подключения к базе   
      $connection = mysqli_connect($host, $user, $password, $db_name);

   // проверка правильности подключения
      if(!$connection){ // при соединении с базой данных возникла ошибка
         echo 'Ошибка соединения: ' . mysqli_connect_error() . '<br>';
         echo 'Код ошибки: ' . mysqli_connect_errno();
      }else{ // соединение было установлено успешно
         // здесь можно делать запрос к базе, 
         // потому что соединение успешно установлено
      }
?>

В этом примере можно заметить функцию mysqli_connect_error. Она выводит текстовое описание ошибки подключения (на английском языке). В отличии от неё функция mysqli_connect_errno выводит числовой код ошибки, к примеру «1045».

Ошибка запроса к базе

Теперь попробуем доработать пример из предыдущего параграфа и добавить запрос к базе данных. Не будем вдаваться в детали, что будет записано в тексте SQL запроса, просто предположим, что он может завершиться ошибкой. К примеру, из-за неожиданного отключения сервера с базой данных от сети. В примере добавим проверку на наличие ошибок при выполнении запроса:

<?php 
   $host = 'localhost'; // адрес сервера
   $db_name = 'database'; // имя базы данных
   $user = 'user'; // имя пользователя
   $password = 'password'; // пароль

   // создание подключения к базе   
      $connection = mysqli_connect($host, $user, $password, $db_name);

      if(!$connection){ // проверка правильности подключения
         echo 'Ошибка соединения: ' . mysqli_connect_error() . '<br>';
         echo 'Код ошибки: ' . mysqli_connect_errno();
      }else{ // подключение успешно установлено

         // текст SQL запроса, который будет передан базе
            $query = 'SELECT * FROM `USERS`';

         // выполняем запрос к базе данных
            $result = mysqli_query($connection, $query);

            if(!$result){ // запрос завершился ошибкой
               echo 'Ошибка запроса: ' . mysqli_error($connection) . '<br>';
               echo 'Код ошибки: ' . mysqli_errno($connection);
            }else{ // запрос успешно выполнился
               while($row = $result->fetch_assoc()){
                  // обрабатываем полученные данные
               }
            }
         // закрываем соединение с базой
            mysqli_close($connection);
      }
?>

В этом примере есть две функции, которые работают с ошибками базы. Функция mysqli_error возвращает описание ошибки запроса (на английском языке), а функция mysqli_errno возвращает числовой код ошибки, к примеру, «1193».

Обратите внимание, что все функции обработки ошибок в этой статье (mysqli_connect_error, mysqli_connect_errno, mysqli_error, mysqli_errno) возвращают информацию только о последней ошибке. Но ошибок может быть несколько.

Была ли статья полезной?

Была ли эта статья полезна?

Есть вопрос?

хостинг для сайтов

Закажите недорогой хостинг

Заказать

всего от 290 руб

Давайте теперь научимся работать с базами
данных через PHP. Для этого прежде всего
необходимо установить соединение с сервером
базы данных.

Делается это с помощью функции mysql_connect,
которая принимает 3 параметра: имя
хоста (сервера), имя пользователя, под которым
мы работаем с базой и пароль для этого пользователя.

Если вы работаете на своем компьютере, то
это будут localhost, root и
пароль в виде пустой строки (на некоторых
серверах он тоже может быть root).
Если ваша база данных в интернете — то эти
данные выдает вам хостинг.

Итак, давайте установим соединение с базой данных:

<?php
$host = 'localhost'; // имя хоста
$user = 'root'; // имя пользователя
$pass = ''; // пароль
$name = 'mydb'; // имя базы данных

$link = mysqli_connect($host, $user, $pass, $name);
?>

Если указанные нами доступы правильные, то
установится соединение к базе данных. При
этом в переменную $link запишется
специальный объект соединения, который мы
будем использовать в дальнейшем для всех
обращений к нашей базе данных.

Посылаем запросы к базе данных

После соединения с базой к ней можно отправлять
запросы. Это делается с помощью функции mysqli_query.
Первым параметром эта функция принимает принимает
переменную, в которую мы записали результат
mysqli_connect, а вторым — строку
с SQL запросом.

К примеру, выполним запрос, который достанет
все записи из таблицы users:

<?php
$result = mysqli_query($link, 'SELECT * FROM users');
?>

Текст запроса не обязательно писать прямо
в параметре функции mysqli_query.
Давайте вынесем его в переменную:

<?php
$query = 'SELECT * FROM users';
$result = mysqli_query($link, $query);
?>

Отлавливаем ошибки базы данных

Как вы уже знаете, в PHP вывод ошибок на
экран включается с помощью функции error_reporting.
Эта функция, однако, не включает вывод ошибок,
допущенных в тексте SQL запроса.

Чтобы вывести ошибки SQL команд, следует
пользоваться функцией mysqli_error,
которую необходимо добавлять к каждому запросу
к БД, вот так:

<?php
$query = 'SELECT * FROM users';
$result = mysqli_query($link, $query) or die(mysqli_error($link));
?>

Пока не будем разбираться с тем, как работает
эта конструкция. Просто добавляйте ее и,
в случае ошибочного SQL запроса вы увидите
сообщение об этом в окне браузера.

Тестируем работоспособность

Давайте теперь напишем тестовый код, который
вы сможете запустить у себя, чтобы убедится
в том, что у вас все подключилось верно.

Для начала убедитесь, что у вас есть база
данных mydb, а в ней таблица users,
заполненная какими-нибудь данными.

Затем запустите у себя следующий код:

<?php
$host = 'localhost'; // имя хоста
$user = 'root'; // имя пользователя
$pass = ''; // пароль
$name = 'mydb'; // имя базы данных

$link = mysqli_connect($host, $user, $pass, $name);

$query = 'SELECT * FROM users';
$result = mysqli_query($link, $query) or die(mysqli_error($link));
var_dump($result);
?>

Если на экране нет ошибок и вы видите результат
var_dump — значит все хорошо. Если
же есть какие-то ошибки — исправьте их и
попробуйте снова.

Скопируйте и запустите у себя приведенный
тестовый код.

image

Небольшой дисклеймер от переводчика: в РНР сложилась парадоксальная ситуация. Сам язык ушёл далеко вперёд, но изучают его по жутко устаревшим материалам. Собственно, постоянный кринж от кода на Тостере (как в вопросах, так и в ответах) и побудил к переводу данной статьи.

Кроме того, переводчик, также как и вы, считает, что PDO является более продвинутым API для работы с БД, чем mysqli. Но поскольку новички в подавляющем большинстве всё равно начинают с mysqli, то нужен хотя бы один нормальный материал по этому расширению. Не можешь противостоять — возглавь!

Не говоря уже о том, что в последнее время mysqli была сильно улучшена, и из совершенно неюзабельной превратилась в довольно сносную библиотеку, в которой из принципиальных отличий от PDO осталось разве что отсутствие именованных плейсхолдеров. Так что даже (особенно) если вы учили РНР 20 лет назад и всё знаете вдоль и поперёк, то всё равно сможете найти для себя что-то новое.

Соединение

Важность кода для соединения с БД часто недооценивают, сводя к его одной-единственной строчке. В то время как правильное соединение поможет заранее решить целую кучу проблем — от кракозябр до непонятных сообщений об ошибках, и даже влияет на безопасность.

Если ваш код является обычным процедурным РНР, то вот простой пример соединения:

$host     = '127.0.0.1';
$db       = 'test';
$user     = 'root';
$password = '';
$port     = 3306;
$charset  = 'utf8mb4';

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli($host, $user, $password, $db, $port);
$db->set_charset($charset);
$db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);

Полное объяснение всех этих команд приводится в отдельной статье, Как правильно соединяться с mysqli (en), а здесь я приведу только ключевые моменты

  • устанавливая правильный режим информирования об ошибках, мы избавляемся от непонятных ошибок типа mysqli_fetch_assoc() expects parameter... / Call to a member function bind_param()..., получая вместо них актуальные сообщения об ошибках от MySQL.
    • кроме того, режим исключений значительно упростит код, в котором не нужно будет писать проверку успешности выполнения каждой функции
  • установка правильного значения charset сразу избавит нас от целого класса проблем, связанных с кодировками, таких как крокозябры/вопросики вместо текста, пустой результат json_encode(), проблемы с сохранением эмодзи, и т.д.
  • с безопасностью не шутят, и сообщения об ошибках ни в коем случае нельзя вываливать прямо в браузер, как это принято во всех устаревших руководствах
  • возвращение из бд любых типов данных в виде строк выглядит в наше время атавизмом. И хотя подготовленные запросы уже возвращают данные типизованными, при использовании функции query() по умолчанию все типы данных возвращаются в виде строк. Чтобы это исправить, на помощь приходит настройка MYSQLI_OPT_INT_AND_FLOAT_NATIVE

Объектный и процедурный интерфейсы

Небольшое, но важное замечание: у mysqli есть одно уникальное свойство: каждая функция может быть вызвана как через объектный, так и через процедурный синтаксис. То есть любое действие может быть выполнено как через вызов функции, так и через обращение к методу объекта:

mysqli_query($mysqli, $query); // процедурный синтаксис
$mysqli->query($query); // объектный синтаксис

Единственное различие заключается в том, что для объектного синтаксиса мы берём параметр функции (например $mysqli), добавляем объектный оператор (->) и дальше пишем собственно имя метода, выкидывая избыточное «mysqli_». Отдельно отмечу, что вам не нужно знать ООП чтобы использовать объектный синтаксис: это просто другой способ вызвать ту же самую функцию.

Оба способа полностью взаимозаменяемы, разница только в синтаксисе. Вы можете использовать любой. Их даже можно смешивать в одном и том же коде — это будет работать, хотя и не одобряется с точки зрения стиля.

Учитывая, что объектный синтаксис является более коротким, без постоянных повторений (ср. mysqli_stmt_get_result($stmt) и $stmt->get_result()) я настоятельно рекомендую именно его, так что именно объектный синтаксис будет использоваться в этом руководстве.

Выполнение запросов, в которых используются переменные. Подготовленные выражения

Одной из основных причин, по которым старое расширение mysql было удалено из PHP, является отсутствие поддержки подготовленных выражений, то есть переменные PHP без вариантов должны были добавляться напрямую в SQL. Но нет ни малейшей причины продолжать эту опасную практику с mysqli. Другими словами, теперь вы должны использовать подготовленные запросы, что означает полное переписывание каждой операции с БД.

Почему надо использовать подготовленные запросы? По той простой причине, что если мы добавляем данные прямо в запрос, то они могут повредить его. При этом последствия варьируются от синтаксических ошибок до SQL инъекций. В отличие от печально известного «экранирования», которое работает только для строк, и которое легко можно забыть, использовать неправильно или посчитать ненужным, подготовленные запросы позволяют нам сформулировать простую, но стопроцентно безопасную инструкцию из трёх шагов:

  1. Подготавливаем запрос, добавляя знаки вопроса, ?, там где раньше была переменная
  2. Привязываем сами переменные к этому подготовленному выражению, указывая для каждой её тип
  3. Выполняем запрос

Вот простой пример запроса INSERT:

$stmt = $db->prepare("INSERT INTO users (email, password) VALUES (?,?)");
$stmt->bind_param("ss", $email, $password_hash);
$stmt->execute();

Как можно видеть, тут нет ничего сложного, те самые три шага, описанные выше.

Давайте рассмотрим подготовленный запрос подробнее, на примере запроса UPDATE:

$sql = "UPDATE users SET name=?, email=?, password=? WHERE id=?";
$stmt= $conn->prepare($sql);
$stmt->bind_param("sssi", $name, $email, $password, $id);
$stmt->execute();

Что здесь происходит?

$sql = "UPDATE users SET name=?, email=?, password=? WHERE id=?";

Как это было описано выше, сначала мы заменяем все переменные запросе на вопросительные знаки.

ВАЖНО: нельзя добавлять к знакам вопроса кавычки — вы добавляете плейсхолдеры, а не строки.

$stmt= $conn->prepare($sql);

Дальше мы подготавливаем запрос. Идея тут очень остроумная: для того чтобы исключить даже теоретическую возможность инъекции, сам запрос и данные для него едут на сервер по отдельности. Именно это мы здесь и видим: вызов prepare() отправляет на сервер сначала сам запрос, без данных. При этом создаётся специальная переменная $stmt, содержащая экземпляр класса mysqli_statement и дальше мы будем работать именно с ней.

$stmt->bind_param("sssi", $name, $email, $password, $id);

Дальше наши переменные должны быть привязаны к подготовленному выражению. Данный вызов состоит из двух частей: сначала идёт строка, в которой перечислены типы передаваемых переменных, а затем и сами переменные. В mysqli вам необходимо указывать тип для каждой переменной. Это делается с помощью одной буквы для каждой переменной. Количество букв должно всегда соответствовать количеству переменных. Возможных типов четыре:

  • i для целых чисел;
  • d для чисел с плавающей запятой;
  • s для строк;
  • b для блобов.

И теперь вы можете сказать, что запись «sssi» означает «у нас будет 3 переменных строкового типа и одна — целочисленного». Затем в функцию передаются все переменные, 4 штуки.

Совет: MySQL с радостью принимает любые данные как строки, так что не нужно сходить с ума пытаясь найти подходящий тип для каждой переменной. Можно просто использовать «s» для всех.

$stmt->execute();

И наконец, запрос выполняется. Переменные отправляются в БД и запрос выполняется.

Важно! Вы не должны проверять результат выполнения запроса вручную. В случае, если соединение было установлено, как описано выше, в случае ошибки mysqli автоматически выбросит исключение.

Кстати, начиная с PHP 8.1, bind_param можно не использовать, отправив вместо этого все переменные в execute() в виде массива:

    $stmt = $db->prepare("INSERT INTO users (email, password) VALUES (?,?)");
    $stmt->execute([$email, $password_hash]);

В этом случае все переменные будут переданы как строки.

Чисто для комплекта, пример запроса DELETE, но я надеюсь, что вы уже уловили идею:

$sql = "DELETE FROM users WHERE id=?";
$stmt= $conn->prepare($sql);
$stmt->bind_param("s", $id);
$stmt->execute();

Выполнение запросов SELECT через подготовленные выражения

Точно так же как это было описано выше, мы подготавливаем запрос с вопросительными знаками, затем привязываем переменные и выполняем запрос. Однако для запросов SELECT нам понадобится один дополнительный шаг, получение переменной типа mysqli_result, которую можно будет использовать для выборки полученных строк:

$stmt = $db->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();

здесь функция get_result() возвращает экземпляр класса mysqli_result, который может использоваться для того чтобы получать возвращённые запросом строки в виде массивов или объектов.

Примечание: Если вам пишет, что такая функция не определена, то надо отметить чекбокс подписанный php_mysqlnd в разделе конфигурации PHP в панели управления вашего хостинга.

Получение результатов запроса

Для получения результата запроса используется переменная, являющаяся экземпляром класса mysqli_result. Все функции, получающие данные из запроса, работают с этой переменной.

Стандартным способом получения как одной, так и нескольких строк, будет обращение к одной из следующих функций:

  • fetch_row() которая возвращает нумерованный массив;
  • fetch_assoc() которая возвращает ассоциативный массив;
  • fetch_object() которая возвращает объект.

Получение одной строки

Если запрос вернул только одну строку, нам нужно обратиться к одной из вышеперечисленных функций. Например:

$stmt = $db->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$username = $row['username'];

Получение нескольких строк в цикле

Что интересно, для получения нескольких строк служит та же самая функция, что и для получения одной строки. И всё благодаря одной маленькой детали: когда мы получаем строку с помощью одной из этих функций, внутренний указатель в возвращённом базой наборе строк перемещается на одну позицию, и поэтому следующее обращение к той же самой функции возвращает следующую строку — и так далее, пока строки не кончатся. Если строк больше нет, то функция fetch_* вернёт null, что позволит нам использовать цикл while для перебора всех строк:

$users = [];
$sql = "SELECT * FROM users ORDER BY id DESC LIMIT 0, 10";
$result = $db->query($sql);
while ($row = $result->fetch_assoc()) {
    $users[] = $row;
}

Здесь мы получили все полученные из БД строки в массив $users.

Подсказка: в mysqli есть удобная функция, которпя сразу возвращает все строки в виде массива: mysqli_fetch_all(). Вот только по какой-то причине она по умолчанию использует fetch_row() для наполнения массива, так что если вам нужны строки в виде ассоциативных массивов, то надо использовать параметр MYSQLI_ASSOC:

$sql = "SELECT * FROM categories";
$result = $db->query($sql);
$data = $result->fetch_all(MYSQLI_ASSOC);

Выполнение запросов без переменных

Если запрос целиком прописан прямо в коде, то есть в нем не используются никакие переменные PHP, то для выполнения запроса можно воспользоваться функцией query(), которая сразу возвращает объект класса mysqli_result, и в результате мы получим гораздо более простой код, например

$menu = $db->query("SELECT * FROM menu")->fetch_all(MYSQLI_ASSOC);
$count = $db->query("SELECT count(*) FROM users")->fetch_row()[0];

Простая функция-хелпер

Но не нужно завидовать, выполнение подготовленных запросов может быть таким же простым, благодаря крошечной функции-хелперу (en):

function prepared_query($mysqli, $sql, $params, $types = "")
{
    $types = $types ?: str_repeat("s", count($params));
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    return $stmt;
}

Эта функция может быть добавлена в файл, в котором прописано соединение с БД и таким образом она будет доступна везде, где требуется mysqli, позволяя писать такие же аккуратные однострочники:

$sql = "SELECT * FROM menu WHERE section=?";
$menu = prepared_query($db, $sql, [$section])->get_result()->fetch_all(MYSQLI_ASSOC);
$sql = "SELECT * FROM users WHERE email=?";
$count = prepared_query($db, $sql, [$email])->get_result()->fetch_assoc();

Обработка ошибок

Обработка ошибок в запросах является очень важной темой, но её реализация вас удивит: в общем случае ошибки mysqli никак обрабатывать не нужно! Несмотря на то, что написано в бесчисленных примерах и руководствах по РНР, как правило, вы не должны писать никакого кода, обрабатывающего ошибки в запросах. Это звучит очень непривычно, но на самом деле именно так и надо делать. Если подумать, то для большинства ошибок надо только сообщить об их возникновении. И mysqli/PHP отлично справляются с этим сами, никакой помощи с вашей стороны им для этого не требуется. Следовательно, вы и не должны писать код, который проверяет результат выполнения запроса — в случае ошибки mysqli сообщит о ней автоматически, благодаря функции mysqli_report() о которой шла речь выше. Таким образом, все ошибки взаимодействия с БД будут обрабатываться единообразно, точно так же, как и все остальные ошибки РНР, что естественно является очень удобным с точки зрения обработки, которую можно выполнять в одном месте, а не разбрасывать по коду отдельно для каждого запроса. Подробнее почитать про правильный подход к обработке ошибок можно в статье Обработка ошибок в PHP (en).

В тех редких случаях, когда вам действительно надо обработать ошибку, то есть выполнить какое-то определённое действие в случае ошибки, а не просто сообщить о её появлении, запрос(ы) можно обернуть в try..catch.

Количество строк, которые вернул запрос SELECT

На самом деле нет ни одной причины использовать привычную функцию mysqli_num_rows(). Если подумать, то вы всегда можете использовать сами полученные данные для ответа на вопрос, были получены какие-то данные, или нет:

$user = $result->fetch_assoc();
if ($user) {
    // found!
}

То же самое относится и к получению нескольких строк, благодаря удобной функции mysqli_fetch_all(), которая сразу вернет все полученные строки в виде массива.

Но конечно же надо помнить, что код ни в коем случае не должен запрашивать из БД больше строк, чем требуется на одной странице. Это относится как к запросам, которые получают определенные строки из БД для последующей обработки, так и — в особенности — к запросам, которые служат только для получения количества строк. Во втором случае вместо запроса самих строк необходимо запросить только их количество, запросом SELECT count(*) ....

Количество строк, затронутых при изменении данных

В отличие от предыдущего, количество строк, затронутых запросами INSERT, UPDATE и DELETE может быть довольно полезным. Что интересно, в mysqli есть не одна, целых две возможности получить эту цифру.

Одна из них — это привычное свойство affected_rows:

$db->query("DELETE FROM users");
echo $db->affected_rows();

Но есть еще одна, уникальная функция mysqli_info(), которая возвращает отдельно количество найденных и затронутых строк. Во всех других драйверах, включая PDO, вы можете получить либо то, либо другое, но не всё вместе. Хотя эта функция возвращает строку, её несложно распарсить, и получить аккуратный массив:

$db->query("update test set i=2");
$pattern = '~Rows matched: (?<matched>d+)  Changed: (?<changed>d+)  Warnings: (?<warnings>d+)~';
preg_match($pattern, $db->info, $matches);
$info = array_filter($matches, "is_string", ARRAY_FILTER_USE_KEY);

Definition and Usage

The mysqli_error() function returns the description of the error occurred during the last MySQLi function call.

Syntax

mysqli_error($con)

Parameters

Sr.No Parameter & Description
1

con(Mandatory)

This is an object representing a connection to MySQL Server.

Return Values

PHP mysqli_error() function returns an string value representing the description of the error from the last MySQLi function call. If there are no errors this function returns an empty string.

PHP Version

This function was first introduced in PHP Version 5 and works works in all the later versions.

Example

Following example demonstrates the usage of the mysqli_error() function (in procedural style) −

<?php
   //Creating a connection
   $con = mysqli_connect("localhost", "root", "password", "mydb");

   //Query to retrieve all the rows of employee table
   mysqli_query($con, "SELECT * FORM employee");

   //Error
   $error = mysqli_error($con);
   print("Error Occurred: ".$error);

   //Closing the connection
   mysqli_close($con);
?>

This will produce following result −

Error Occurred: 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 'FORM employee' at line 1

Example

In object oriented style the syntax of this function is $con ->error. Following is the example of this function in object oriented style −

<?php
   //Creating a connection
   $con = new mysqli("localhost", "root", "password", "mydb");

   //Query to retrieve all the rows of employee table
   $con -> query("SELECT * FROM wrong_table_name");

   //Error 
   $error = $con ->error;
   print("Error Occurred: ".$error);

   //Closing the connection
   $con -> close();
?>

This will produce following result −

Error Occurred: Table 'mydb.wrong_table_name' doesn't exist

Example

Following is another example of the mysqli_error() function −

<?php
   //Creating a connection
   $con = mysqli_connect("localhost", "root", "password", "mydb");

   //Query to SELECT all the rows of the employee table
   mysqli_query($con, "SELECT * FROM employee");
   print("Errors in the SELECT query: ".mysqli_error($con)."n");

   //Query to UPDATE the rows of the employee table
   mysqli_query($con, "UPDATE employee set INCOME=INCOME+5000 where FIRST_NAME in (*)");
   print("Errors in the UPDATE query: ".mysqli_error($con)."n");

   //Query to INSERT a row into the employee table
   mysqli_query($con, "INSERT INTO employee VALUES (Archana, 'Mohonthy', 30, 'M', 13000, 106)");
   print("Errors in the INSERT query: ".mysqli_error($con)."n");
  
   //Closing the connection
   mysqli_close($con);
?>

This will produce following result −

Errors in the SELECT query:
Errors in the UPDATE query: 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
Errors in the INSERT query: Unknown column 'Archana' in 'field list'

Example

<?php
   $connection_mysql = mysqli_connect("localhost","root","password","mydb");
   
   if (mysqli_connect_errno($connection_mysql)){
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }
   
   if (!mysqli_query($connection_mysql,"INSERT INTO employee (FirstName) VALUES ('Jack')")){
      echo("Error description: " . mysqli_error($connection_mysql));
   }
   
   mysqli_close($connection_mysql);
?>

This will produce following result −

Error description: Unknown column 'FirstName' in 'field list'

php_function_reference.htm

Понравилась статья? Поделить с друзьями:
  • Mysqli last error
  • Mysqli insert error
  • Mysqli get error
  • Mysqli error не выводит ошибку
  • Mysqli error no database selected