mysqli_error
(PHP 5, PHP 7, PHP
mysqli::$error — mysqli_error — Возвращает строку с описанием последней ошибки
Описание
Объектно-ориентированный стиль
Процедурный стиль
mysqli_error(mysqli $mysql
): string
Возвращаемые значения
Строка с описанием ошибки. Пустая строка, если ошибки нет.
Примеры
Пример #1 Пример с $mysqli->error
Объектно-ориентированный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* Проверить соединение */
if ($mysqli->connect_errno) {
printf("Соединение не удалось: %sn", $mysqli->connect_error);
exit();
}
if (!
$mysqli->query("SET a=1")) {
printf("Сообщение ошибки: %sn", $mysqli->error);
}/* Закрыть соединение */
$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, "SET a=1")) {
printf("Сообщение ошибки: %sn", mysqli_error($link));
}/* Закрыть соединение */
mysqli_close($link);
?>
Результат выполнения данных примеров:
Сообщение ошибки: Unknown system variable 'a'
Смотрите также
- mysqli_connect_errno() — Возвращает код ошибки последней попытки соединения
- mysqli_connect_error() — Возвращает описание последней ошибки подключения
- mysqli_errno() — Возвращает код ошибки последнего вызова функции
- mysqli_sqlstate() — Возвращает код состояния SQLSTATE последней MySQL операции
information at saunderswebsolutions dot com ¶
17 years ago
The mysqli_sql_exception class is not available to PHP 5.05
I used this code to catch errors
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!
$res) {
printf("Errormessage: %sn", $mysqli->error);
}?>
The problem with this is that valid values for $res are: a mysqli_result object , true or false
This doesn't tell us that there has been an error with the sql used.
If you pass an update statement, false is a valid result if the update fails.
So, a better way is:
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!
$mysqli->error) {
printf("Errormessage: %sn", $mysqli->error);
}?>
This would output something like:
Unexpected PHP error [mysqli::query() [<a href='function.query'>function.query</a>]: (42S22/1054): Unknown column 'XXname' in 'field list'] severity [E_WARNING] in [G:database.php] line [249]
Very frustrating as I wanted to also catch the sql error and print out the stack trace.
A better way is:
<?php
mysqli_report(MYSQLI_REPORT_OFF); //Turn off irritating default messages$mysqli = new mysqli("localhost", "my_user", "my_password", "world");$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (
$mysqli->error) {
try {
throw new Exception("MySQL error $mysqli->error <br> Query:<br> $query", $msqli->errno);
} catch(Exception $e ) {
echo "Error No: ".$e->getCode(). " - ". $e->getMessage() . "<br >";
echo nl2br($e->getTraceAsString());
}
}//Do stuff with the result
?>
Prints out something like:
Error No: 1054
Unknown column 'XXname' in 'field list'
Query:
SELECT XXname FROM customer_table
#0 G:\database.php(251): database->dbError('Unknown column ...', 1054, 'getQuery()', 'SELECT XXname F...')
#1 G:dataWorkSites1framework5testsdbtest.php(29): database->getString('SELECT XXname F...')
#2 c:PHPincludessimpletestrunner.php(58): testOfDB->testGetVal()
#3 c:PHPincludessimpletestrunner.php(96): SimpleInvoker->invoke('testGetVal')
#4 c:PHPincludessimpletestrunner.php(125): SimpleInvokerDecorator->invoke('testGetVal')
#5 c:PHPincludessimpletestrunner.php(183): SimpleErrorTrappingInvoker->invoke('testGetVal')
#6 c:PHPincludessimpletestsimple_test.php(90): SimpleRunner->run()
#7 c:PHPincludessimpletestsimple_test.php(498): SimpleTestCase->run(Object(HtmlReporter))
#8 c:PHPincludessimpletestsimple_test.php(500): GroupTest->run(Object(HtmlReporter))
#9 G:all_tests.php(16): GroupTest->run(Object(HtmlReporter))
This will actually print out the error, a stack trace and the offending sql statement. Much more helpful when the sql statement is generated somewhere else in the code.
se (at) brainbits (dot) net ¶
16 years ago
The decription "mysqli_error -- Returns a string description of the LAST error" is not exactly that what you get from mysqli_error. You get the error description from the last mysqli-function, not from the last mysql-error.
If you have the following situation
if (!$mysqli->query("SET a=1")) {
$mysqli->query("ROLLBACK;")
printf("Errormessage: %sn", $mysqli->error);
}
you don't get an error-message, if the ROLLBACK-Query didn't failed, too. In order to get the right error-message you have to write:
if (!$mysqli->query("SET a=1")) {
printf("Errormessage: %sn", $mysqli->error);
$mysqli->query("ROLLBACK;")
}
callforeach at gmail dot com ¶
7 years ago
I had to set mysqli_report(MYSQLI_REPORT_ALL) at the begin of my script to be able to catch mysqli errors within the catch block of my php code.
Initially, I used the below code to throw and subsequent catch mysqli exceptions
<?php
try {
$mysqli = new mysqli('localhost','root','pwd','db');
if ($mysqli->connect_errno)
throw new Exception($mysqli->connect_error);
} catch (
Exception $e) {
echo $e->getMessage();
}I realized the exception was being thrown before the actual throw statement and hence the catch block was not being called.My current code looks like
mysqli_report(MYSQLI_REPORT_ALL) ;
try {
$mysqli = new mysqli('localhost','root','pwd','db');
/* I don't need to throw the exception, it's being thrown automatically */} catch (Exception $e) {
echo $e->getMessage();
}This works fine and I'm able to trap all mysqli errors
abderrahmanekaddour dot aissat at gmail dot com ¶
5 months ago
<?php// The idea is the add formated errors information for developers to easier bugs detection.$myfile = fopen("database_log.log", "r");
$db = new mysqli("localhost", "root","root","data");
if(!$db->query("SELECT")){
$timestamp = new DateTime();
$data_err = " {
"title": " Select statement error ",
"date_time": ".$timestamp->getTimestamp().",
"error":" ".$db->error." "
} "; // Do more information
fwrite($myfile, $data_err); // writing data
}
// In separate file do file read and format it for good visual.$db->close();
fclose($myfile);
?>
asmith16 at littlesvr dot ca ¶
9 years ago
Please note that the string returned may contain data initially provided by the user, possibly making your code vulnerable to XSS.
So even if you escape everything in your SQL query using mysqli_real_escape_string(), make sure that if you plan to display the string returned by mysqli_error() you run that string through htmlspecialchars().
As far as I can tell the two escape functions don't escape the same characters, which is why you need both (the first for SQL and the second for HTML/JS).
information at saunderswebsolutions dot com ¶
17 years ago
Hi, you can also use the new mysqli_sql_exception to catch sql errors.
Example:
<?php
//set up $mysqli_instance here..
$Select = "SELECT xyz FROM mytable ";
try {
$res = $mysqli_instance->query($Select);
}catch (mysqli_sql_exception $e) {
print "Error Code <br>".$e->getCode();
print "Error Message <br>".$e->getMessage();
print "Strack Trace <br>".nl2br($e->getTraceAsString());
}?>
Will print out something like
Error Code: 0
Error Message
No index used in query/prepared statement select sess_value from frame_sessions where sess_name = '5b85upjqkitjsostvs6g9rkul1'
Strack Trace:
#0 G:classfileslib5database.php(214): mysqli->query('select sess_val...')
#1 G:classfileslib5Session.php(52): database->getString('select sess_val...')
#2 [internal function]: sess_read('5b85upjqkitjsos...')
#3 G:classfilesincludes.php(50): session_start()
#4 G:testsall_tests.php(4): include('G:dataWorkSit...')
#5 {main}
Anonymous ¶
3 years ago
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$this->connection = mysqli_connect($hostname,$username,$password, $dbname);
} catch (Exception $e) {
echo "Errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Text error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
mysqli_query
(PHP 5, PHP 7, PHP
mysqli::query — mysqli_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.
За последние 24 часа нас посетили 11353 программиста и 1121 робот. Сейчас ищут 307 программистов …
mysqli::$error
mysqli_error
(PHP 5, PHP 7)
mysqli::$error — mysqli_error — Возвращает строку с описанием последней ошибки
Описание
Объектно-ориентированный стиль
Процедурный стиль
string mysqli_error
( mysqli $link
)
Возвращаемые значения
Строка с описанием ошибки. Пустая строка, если ошибки нет.
Примеры
Пример #1 Пример с $mysqli->error
Объектно-ориентированный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %sn", $mysqli->connect_error);
exit();
}
if (!
$mysqli->query("SET a=1")) {
printf("Errormessage: %sn", $mysqli->error);
}/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %sn", mysqli_connect_error());
exit();
}
if (!
mysqli_query($link, "SET a=1")) {
printf("Errormessage: %sn", mysqli_error($link));
}/* close connection */
mysqli_close($link);
?>
Результат выполнения данных примеров:
Errormessage: Unknown system variable 'a'
Смотрите также
- mysqli_connect_errno() — Возвращает код ошибки последней попытки соединения
- mysqli_connect_error() — Возвращает описание последней ошибки подключения
- mysqli_errno() — Возвращает код ошибки последнего вызова функции
- mysqli_sqlstate() — Возвращает код состояния SQLSTATE последней MySQL операции
Вернуться к: mysqli
Правильная обработка ошибок позволяет сделать стабильное приложение, которое не будет завершаться неожиданно. В случае возникновения непредвиденной ситуации программа должна выдавать вменяемый ответ, почему она не хочет исполнится. И создание правильного механизма обработки ошибок — это задача программиста.
В этой статье рассмотрим два вида ошибок, которые могут возникнуть при программировании взаимодействия с базой данных. Первый тип — это ошибка подключения к базе данных. Второй тип — это ошибка выполнения запроса к базе данных. Для обработки этих ошибок будем использовать специальные функции для работы с базой.
Ошибка соединения с базой данных
Сразу приведём пример обработки ошибки с соединением с базой данных:
<?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
MySQLi
Error Functions - Conclusion
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:
Now, change the table name in the SQL
query from teacher
to person
and observe the output given below.
Output:
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:
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:
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:
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:
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:
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:
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.
Для кого это статья? Первоочередной целью написания статьи было именно «разложить все по полочкам» для тех, кто уже работал с mysqli, но не вникал глубоко, а быстренько написал свои обертки и забыл про оригинальный синтаксис. Я постарался разъяснить нюансы, с которым столкнулся сам, при переносе данных из большой и очень старой БД, спроектированной человеком, не знающим про нормализации, в новую, с сильно изменившейся структурой.
Можно ли читать эту статью людям, которые все еще используют старое расширение mysql и только думающие об перехода на PDO или MySqli? Думаю даже нужно.
MySqli или PDO
Последние годы я писал сайты исключительно на фреймворках, что избавляло меня от работы с БД напрямую. Некоторое время назад начал работу над сайтом на чистом php и задался вопросом, что использовать вместо устаревшего и нерекомендованного к использованию старого расширения PHP MySQL.
Выбирать нужно было между MySqli и PDO. После не очень длительного изучения решил остановиться на MySqli, так как, как мне тогда казалось, он полностью идентичен PDO, за исключением того, что нет возможности отказаться от MySQL в пользу чего-то другого. Как я напишу ниже это не совсем так, минимум одно заметное отличие есть.
MySqli рекомендован к использованию самими разработчиками PHP.[1]
ООП и процедурный интерфейс
MySqli позволяет писать код как в ООП стиле так и в процедурном. Мне ближе ООП как и большинству из хабр сообщества, поэтому в этом статье будет использован именно он.
Три основные класса
MySqli имеет 3 основные класса, которые будут подробно рассмотрены в этой статье
- mysqli — необходим для установки соединения с БД и будет полезен, если мы хотим выполнить запросы так, как мы это делали в старом расширении MySQL;
- mysqli_stmt — необходим для использования новой возможности MySqli: выполнять запросы по подготовленным выражениям;
- mysqli_result — объединяет функции для получения результатов запросов, сделанных с помощью mysqli или mysqli_stmt.
Рассмотрим каждый из них подробнее ниже.
Соединение с БД
Есть два способа.
Способ первый. Если вам нужно просто создать соединение.
$mysqli = new mysqli(‘localhost’, ‘my_user’, ‘my_password’, ‘my_db’);
if ($mysqli->connect_error) {
die(‘Connect Error (‘ . $mysqli->connect_errno . ‘) ‘ . $mysqli->connect_error);
}
Способ второй. Если вам нужно использовать опции соединения.
$mysqli = mysqli_init();
if (!$mysqli) {
die(‘mysqli_init failed’);
}if (!$mysqli->options(MYSQLI_INIT_COMMAND, ‘SET AUTOCOMMIT = 0’)) {
die(‘Setting MYSQLI_INIT_COMMAND failed’);
}if (!$mysqli->real_connect(‘localhost’, ‘my_user’, ‘my_password’, ‘my_db’)) {
die(‘Connect Error (‘ . $mysqli->connect_errno . ‘) ‘ . $mysqli->connect_error);
}
С помощью $mysqli->connect_errno и $mysqli->connect_error мы получаем описание и код ошибки, возникших при соединении. И new mysqli() и $mysqli->real_connect() при ошибках соединений вызывают ошибку PHP Warning. Поэтому вывод ошибок с помощью выше упомянутых функций имеет смысл, если у вас отключено отображение ошибок PHP, например, на рабочем сервере, либо если вам нужно как-то обработать эти данные. Я упомнил здесь об этом, потому что не все функции MySQLi вызывают PHP Warning в случае ошибки, и для того что бы узнать, что произошла ошибка необходимо обязательно обращаться к специальным функциям, об этом ниже.
Полученный при соединении объект мы присвоили переменной $mysqli, для того чтобы использовать его в дальнейшем. Это очевидно для ООП стиля, но и для процедурного стиля этот объект также необходим, в этом отличие от устаревшего расширения MySQL, где ссылку на соединение необязательно было передавать при каждом использовании mysql функций.
Буферизированные и не буферизированные результаты
Прежде чем рассказывать дальше, хотелось бы объяснить разницу между этими двумя типами результатов.
Рассмотрим небуферизированный результат. В этом случае вы можете начинать читать результаты, не дожидаясь пока mysql сервер получит результат полностью.
Преимущества:
- Результат можно начинать читать раньше, сокращается время ожидания;
- Результат не занимает место в оперативной памяти.
Недостатки:
- Невозможно узнать, сколько строк получено;
- Невозможно передвигаться к определенному результату, то есть можно читать данные только с начала и по порядку;
- Нельзя выполнять других запросов, пока не закрыт этот результат.
Буферизированный результат лишен этих недостатков и соответственно лишен перечисленных преимуществ.
«Классические» запросы
В MySqli оставили возможность «классических» запросов: когда пользователю предлагается самостоятельно заниматься безопасностью передаваемых запросов так, как это было в устаревшем расширении MySQL. Для этого предлагается использовать функцию $mysqli->real_escape_string(), с помощью которой необходимо обрабатывать все данные перед помещением их в запрос.
Так же как и с соединением есть два способа сделать такой запрос короткий и длинный.
Короткий.
$result = $mysqli->query(‘текст запроса’, MYSQLI_USE_RESULT);
Возможные константы:
MYSQLI_STORE_RESULT – вернет буферизированный результат, значение по умолчанию
MYSQLI_USE_RESULT – небуферизированный
Длинный.
$mysqli->real_query(‘текст запроса’);
echo($mysqli->field_count); // вернет количество столбцов, в результате,
// можно получить до начала получения результата, что дает дополнительную гибкость
// по сравнению c коротким способом, разумеется, вызывать не обязательно
$result = $mysqli->use_result(); // вернет небуферизированный результат
// или
$result = $mysqli->store_result(); // вернет буферизированный результат
Функции $mysqli->use_result() или $mysqli->store_result() так же используются при мульти запросах (запросах состоящих из нескольких запросов). Мульти запросы в этой статье рассмотрены не будут.
И тот и другой синтаксисы вернут результат в виде объекта mysqli_result, который представляет собой удобный интерфейс для работы с результатом, как с буферизированным так и не с небуферизированным.
Как я писал выше, не все функции MySQLi выбрасывают ошибки PHP, описанные выше функции из их числа. В случае если запрос неверный и сервер вернул ошибку, PHP не даст об этом знать. Для проверки используйте функции:
- $mysqli->error – описание ошибки
- $mysqli->errno – код ошибки
$city = $mysqli->real_escape_string($city);
$mysqli->query(«SELECT * FROM `city` WHERE `id` = ‘$city‘»);
if ($mysqli->errno) {
die(‘Select Error (‘ . $mysqli->errno . ‘) ‘ . $mysqli->error);
}
Преимущества «классического» синтаксиса запросов:
- Он значительно более компактен, чем подготовленные выражения (класс mysqli_stmt);
- Он позволяет получить небуферизированный результат в виде mysqli_result. Подготовленные выражения позволяют получить только буферизированный результат mysqli_result, а с небуферизированным придется работать средствами mysqli_stmt, который значительно менее гибкий, чем mysqli_result.
Практическое применение «классического» синтаксиса запросов я вижу:
- В не буферизированных запросах, если вам хочется использовать преимущества работы с mysqli_result;
- В запросах INSERT, UPDATE, REPLACE или DELETE, если для вас предпочтителен их более короткий синтаксис.
Для таких запросов будут полезны свойства:
- $mysqli->affected_rows – количество затронутых строк предыдущим запросом не на выборку
- $mysqli->insert_id – автоматически сгенерированный ID для последнего запроса вставки.
Подготовленные запросы
Преимущества подготовленных запросов над «классическими»:
- При серии запросов, в которых меняются лишь данные, запрос передается на сервер только один раз, в дальнейшем посылаются только изменяющиеся данные;
- Защита от SQL-инъекций.
За работу с подготовленными запросами в MySQLi отвечает класс mysqli_stmt.
Два способа создания подготовленного запроса.
// первый способ — используя объект mysqli
$mysqli->prepare(«SELECT * FROM `sk2_articles` WHERE `id` = ?»);
if ($mysqli->errno) {
die(‘Select Error (‘ . $mysqli->errno . ‘) ‘ . $mysqli->error);
}// второй способ — используя объект mysqli_stmt
$stmt = $mysqli->stmt_init();
$stmt->prepare(«SELECT * FROM `sk2_articles` WHERE `id` = ?»);
if ($stmt->errno) {
die(‘Select Error (‘ . $stmt->errno . ‘) ‘ . $stmt->error);
}
Различия в том, для какого объекта вызываются функции получения информации об ошибке. Мне второй способ кажется удобнее, потому что проверки на ошибки можно объединить в один блок if c другими функциями mysqli_stmt. Как это сделать будет видно в примерах ниже.
$id_min = 81;
$id_max = 88;
$stmt = $mysqli->stmt_init();
if(
// подготовливаем запрос, там куда будут вствлятся данные отмечаем символом ? (плейсхолдоры)
($stmt->prepare(«SELECT title FROM sk2_articles WHERE id > ? and id < ?») ===FALSE)
// привязываем переменные к плейсхолдорам
or ($stmt->bind_param(‘ii’, $id_min, $id_max) === FALSE)
// отрправляем даные, которые на данный момент находятся в привязанных переменных
or ($stmt->execute() === FALSE)
// привязывем переменую для получения в нее результата
or ($stmt->bind_result($title) === FALSE)
// делаем запрос буферизированным,
// если бы этой строки не было, запрос был бы небуферезированым
or ($stmt->store_result() === FALSE)
// получение результата в привязанную переменную
or ($stmt->fetch() === FALSE)
// закрываем подготовленный запрос
or ($stmt->close() === FALSE)
) {
die(‘Select Error (‘ . $stmt->errno . ‘) ‘ . $stmt->error);
}
echo $title;
Несколько пояснений к выше написанному коду.
- В $stmt->bind_param() первым параметром указываем тип привязываемых данных (i – integer, d — double, s – строка). Вторым и последующим указываются переменные, которые будет привязаны к соответствующим плейсхолдорам, объявленным в $stmt->prepare() символами «?» в том порядке, в каком они указаны в $stmt->prepare(). Это заметное отличие от PDO, где плесхолдоры могут быть именованными, а значит не зависят от порядка объявления.
- $stmt->bind_result по-моему самое слабое место класса mysqli_stmt, так как оно обязывает знать, какие именно данные будут получены из запроса и каком порядке они объявлены в запросе. Для случая “SELECT * FROM …” он вряд ли применим. Гораздо более гибкий подход в работе с результатом предлагает класс mysqli_result. Чтобы быть окончательно объективным, стоит упомянуть, что можно воспользоваться функцией $stmt->result_metadata() получить mysqli_result содержащий только о метаданные без самих данных, и посмотреть что за столбцы получены, но этот подход мне кажется излишне сложным, и о нем я упомянул только, чтобы избежать обвинений в неточной информации.
- $stmt->store_result(), как я написал в комментарии к строке, необязательный и нужен для того, чтобы можно было использовать такие функции как:
- $mysqli_stmt->num_rows – количество полученных строк к результате,
- $stmt->data_seek – перемещение внутреннего указателя на заданную строку результата,
- $stmt->free_result() – и не забудьте вызвать освобождение памяти если вы использовали $stmt->store_result().
- $stmt->fetch() возвращает TRUE/FALSE если данные были получены удачно/неудачно, и NULL если данных больше нет.
- Не все функции, объединенные в блок if, в случае ошибки помещают ее в $stmt->error, некоторые вызывают PHP Warning, но все из них в случае неудачи возвращают FALSE, поэтому мне кажется эта конструкция удачной. Если вам нужно выполнить несколько раз $stmt->execute() или $stmt->fetch(), то так сделать не получится.
- Не зависимо от того, был ли запрос буферизированный или нет, доступны следующие свойства:
- $stmt->field_count — количество столбцов в результате,
- $stmt->affected_rows – количество затронутых строк предыдущим запросом не на выборку,
- $stmt->insert_id – автоматически сгенерированный id предыдущей вставки.
Изменим код так, чтобы получить результат в виде экземпляра объекта mysqli_result.
$id_min = 81;
$id_max = 88;
$stmt = $mysqli->stmt_init();
if(
($stmt->prepare(«SELECT title FROM sx2_links WHERE id > ? and id < ?») === FALSE)
or ($stmt->bind_param(‘ii’, $id_min, $id_max) === FALSE)
or ($stmt->execute() === FALSE)
// получение буферизированного результата в виде mysqli_result,
// небуферизированный результат получить нельзя, о чем я писал в недостатках
or (($result = $stmt->get_result()) === FALSE)
or ($stmt->close() === FALSE)
) {
die(‘Select Error (‘ . $stmt->errno . ‘) ‘ . $stmt->error);
}
$row = $result->fetch_row();
echo $row[0];
Класс mysqli_result и работа с результатом с помощью него
Как было показано выше, объект mysqli_result вы могли получить как с помощью «классического» запроса с помощью класса mysqli, тогда он может быть как буферизированный так и небуферизированный, так и с помощью класса mysqli_stmt, тогда он буферизированный. От того какой результат вы получили, зависит работа функций этого класса, поэтому нужно хорошо понимать, что если ваш запрос небуферизированный вы не располагаете всем результатом и соответственно не можете знать сколько строк в результате, и читать его можно только по-порядку строка за строкой.
Набор функций в этом классе покажется знакомым по-старому расширения:
- $result->fetch_row() – получает текущий ряд результата в виде нумерованного массива,
- $result->fetch_assoc() – в виде ассоциативного массива,
- $result->fetch_array() – тип массива задается константой,
- MYSQLI_ASSOC – ассоциативный,
- MYSQLI_NUM – нумерованный,
- MYSQLI_BOTH – оба,
- $result->fetch_object() – строка результата в виде объекта.
Про $result->fetch_object() хотелось бы поговорить отдельно. У этой функции есть два параметра, оба необязательные:
- class_name – имя класса, на основе которого будет создан объект,
- params – массив параметров, которые будут переданы конструктору при создании объекта.
Как видите, передать конструктору класса предположим ассоциативный массив одной строки результата с помощью этой функции не получится. Она сама за вас присвоит свойствам класса, совпадающие с названиями полей результаты. Если свойства класса не будет найдено, оно создается динамически, с областью видимости public.
class Book
{
private $some1;
public $some2;
protected $id;function __construct($param1, $param2) {
$this->some1 = $param1;
$this->some2 = $param2;
}
}
$book = $result->fetch_object(‘Book’, array(1, 2));
var_dump( $book);
Выведет, если в результате было только одно поле id
object(Book)[4]
private ‘some1’ => int 1
public ‘some2’ => int 2
protected ‘id’ => int 382
Другие полезные функции и свойства рассматриваемого класса:
- $result->fetch_all() — получение всех рядов в виде массива нумерованного / ассоциативного / обоих типов ,
- $result->data_seek() — установка внутреннего указателя на заданный ряд результата,
- $result->num_rows – количество строк в результате.
Ссылки:
Страница MySQLi в официальной документации на php.net
Больше примеров по MySQLi
Список функций MySQLi на русском языке
Last update on August 19 2022 21:50:40 (UTC/GMT +8 hours)
mysqli_error() function / mysqli::$error
The mysqli_error() function / mysqli::$error returns the last error description for the most recent function call, if any.
Syntax:
Object oriented style
string $mysqli->error;
Procedural style
string mysqli_error ( mysqli $link )
Parameter:
Name | Description | Required/Optional |
---|---|---|
link | A link identifier returned by mysqli_connect() or mysqli_init() | Required for procedural style only and Optional for Object oriented style |
Usage: Procedural style
mysqli_error(connection);
Parameter:
Name | Description | Required/Optional |
---|---|---|
connection | Specifies the MySQL connection to use. | Required |
Return value:
A string that describes the error. An empty string if no error occurred.
Version: PHP 5, PHP 7
Example of object oriented style:
<?php
$mysqli = new mysqli("localhost", "user1", "datasoft123", "hr");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %sn", $mysqli->connect_error);
exit();
}
if (!$mysqli->query("SET a=1")) {
printf("Errormessage: %sn", $mysqli->error);
}
/* close connection */
$mysqli->close();
?>
Output:
Errormessage: Unknown system variable 'a'
Example of procedural style:
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %sn", mysqli_connect_error());
exit();
}
if (!mysqli_query($link, "SET a=1")) {
printf("Errormessage: %sn", mysqli_error($link));
}
/* close connection */
mysqli_close($link);
?>
Output:
Errormessage: Unknown system variable 'a'
Example:
<?php
$con=mysqli_connect("localhost","user1","datasoft123","hr");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// Perform a query, check for error
if (!mysqli_query($con,"INSERT INTO employees (First_Name) VALUES ('David')"))
{
echo("Errorcode: " . mysqli_errno($con));
}
mysqli_close($con);
?>
Sample Output:
Errorcode: 1146
See also
PHP Function Reference
Previous: error_list
Next: field_count
PHP: Tips of the Day
PHP — Generating a random password in PHP
Security warning: rand() is not a cryptographically secure pseudorandom number generator. Look elsewhere for generating a cryptographically secure pseudorandom string in PHP.
Try this (use strlen instead of count, because count on a string is always 1):
function randomPassword() { $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; $pass = array(); //remember to declare $pass as an array $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache for ($i = 0; $i < 8; $i++) { $n = rand(0, $alphaLength); $pass[] = $alphabet[$n]; } return implode($pass); //turn the array into a string }
Ref : https://bit.ly/39BNAs0