PHP Mysqli позволява множество заявки с функцията multi_query() .
Следното е да добавите към разговора общи думи и да избегнете скръбта от безкрайните Извън синхрон грешки, когато блокове от множество заявки се изпълняват един върху друг. Или не-множество след множество.
Проблемът започва след изпълнението на multi_query()
ако след това се премине към следващата заявка, без да се изчисти наборът от резултати. Грешката ще бъде тази, обозначена като Note1 в долната част. Но се избягва в този отговор.
Конкретният ви проблем няма нищо общо с \r\n
или \n\r
. Те бяха тествани като част от това усилие, но бяха оставени, за да не объркат следващия човек, който идва с техния проблем, различно.
<?php
//mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
mysqli_report(MYSQLI_REPORT_ALL);
error_reporting(E_ALL); // report all PHP errors
ini_set("display_errors", 1);
echo "start<br/>";
try {
$mysqli= new mysqli('hostname', 'dbuser', 'pwd', 'dbname');
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
echo "I am connected and feel happy.<br/>";
$query = "INSERT INTO `table1`(`thing`) values ('aaa')";
$mysqli->query($query);
// works fine
// Note the concat below
$query = "INSERT INTO `table1`(`thing`) values ('bbb1'); ";
$query .=$query; // double it up with concat (in other words two insert)
// we have a multi query so call it the right way:
$mysqli->multi_query($query);
// we need to clear the protocol to avoid Out of Sync errors
// http://stackoverflow.com/a/21754463
do {
$mysqli->use_result();
}while( $mysqli->more_results() && $mysqli->next_result() );
// if you remark out the above 3 lines,
// expect error message depicted in **** Note1 ****
// purpose of this next block is to show result sets are cleared
// from prior multi, and we can do another insert
// thus avoiding error 500 out of sync errors
$query = "INSERT INTO `table1`(`thing`) values ('ccc')";
$mysqli->query($query); // a single insert statement
// Finally, this shows that running a multi without a multi_query fcn call will bomb
$query = "INSERT INTO `table1`(`thing`) values ('explosion'); \r\n";
$query .=$query; // double it up with concat
$mysqli->query($query); // make a multi query explode by not calling multi_query (but rather query)
// The above line generated an error, error message below (**** Note2 ****)
$mysqli->close();
} catch (mysqli_sql_exception $e) {
throw $e;
}
?>
Резултати от базата данни:
select * from table1;
+----+-------+
| id | thing |
+----+-------+
| 1 | aaa |
| 2 | bbb1 |
| 3 | bbb1 |
| 4 | ccc |
+----+-------+
Следните съобщения за грешка са споменати в показания изходен код. Първото се избягва напълно. Вторият не е и там показва, че функцията multi_query()
, за разлика от query()
, е задължително.
****** Забележка 1 ******
****** Забележка 2 ******