Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

PHP+Mysql: не работают несколько запросов одновременно?

#php #mysql


Здравствуйте!

Подскажите, пожалуйста, почему в php не работает такой групповой запрос:

$query = "SELECT * FROM table WHERE id = '1';
          DELETE from table WHERE id = '1'";
$res = mysql_query($query);


В MySQL всё выполняется без проблем.

Так же, если в php выполнить по отдельности, то тоже всё выполняется:

$query = "SELECT * FROM table WHERE id = '1'";
$res = mysql_query($query);
$query = "DELETE from table WHERE id = '1'";
$res = mysql_query($query);


В чем может быть проблема?

Спасибо!
    


Ответы

Ответ 1



Из комментариев и документации: mysql_query() посылает один запрос (посылка нескольких запросов не поддерживается) активной базе данных сервера ... [1] Не используйте функции mysql_*, они устарели. Используйте вместо них MySQLi или PDO_MySQL

Ответ 2



Напишу, что для расширения mysql, если движок БД - InnoDB, то можно обернуть всё в одну транзакцию и работать с ней: class MySQLDB { private $connection; // The MySQL database connection /* Class constructor */ function MySQLDB(){ /* Make connection to database */ $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error()); mysql_select_db(DB_NAME, $this->connection) or die(mysql_error()); } /* Transactions functions */ function begin(){ $null = mysql_query("START TRANSACTION", $this->connection); return mysql_query("BEGIN", $this->connection); } function commit(){ return mysql_query("COMMIT", $this->connection); } function rollback(){ return mysql_query("ROLLBACK", $this->connection); } function transaction($q_array){ $retval = 1; $this->begin(); foreach($q_array as $qa){ $result = mysql_query($qa['query'], $this->connection); if(mysql_affected_rows() == 0){ $retval = 0; } } if($retval == 0){ $this->rollback(); return false; }else{ $this->commit(); return true; } } }; /* Create database connection object */ $database = new MySQLDB; // then from anywhere else simply put the transaction queries in an array or arrays like this: function function(){ global $database; $q = array ( array("query" => "UPDATE table WHERE something = 'something'"), array("query" => "UPDATE table WHERE something_else = 'something_else'"), array("query" => "DELETE FROM table WHERE something_else2 = 'something_else2'"), ); $database->transaction($q); } Как уже отмечалось выше: Не используйте функции mysql_*, они устарели. Используйте вместо них MySQLi или PDO_MySQL И как облегчение: у mysqli есть как раз-таки функция для множественных запросов. Примитивный пример: $mysqli = new mysqli("example.com", "user", "password", "database"); if ($mysqli->connect_errno) { echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; } if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) { echo "Не удалось создать таблицу: (" . $mysqli->errno . ") " . $mysqli->error; } $sql = "SELECT COUNT(*) AS _num FROM test; "; $sql.= "INSERT INTO test(id) VALUES (1); "; $sql.= "SELECT COUNT(*) AS _num FROM test; "; if (!$mysqli->multi_query($sql)) { echo "Не удалось выполнить мультизапрос: (" . $mysqli->errno . ") " . $mysqli->error; } do { if ($res = $mysqli->store_result()) { var_dump($res->fetch_all(MYSQLI_ASSOC)); $res->free(); } } while ($mysqli->more_results() && $mysqli->next_result());

Комментариев нет:

Отправить комментарий