【问题标题】:multi_query in phpphp中的multi_query
【发布时间】:2011-04-01 13:55:02
【问题描述】:

我有一个包含两个表的数据库“测试”。

这里是 phpmyadmin 转储:

CREATE TABLE IF NOT EXISTS `tags` (
  `name` varchar(100) NOT NULL,
  `id` int(4) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `tags`
--

INSERT INTO `tags` (`name`, `id`) VALUES
('tag_one', 1),
('tag_two', 1),
('tag_three', 1);

-- --------------------------------------------------------

--
-- Table structure for table `tags_used`
--

CREATE TABLE IF NOT EXISTS `tags_used` (
  `name` varchar(100) NOT NULL,
  `used` int(4) NOT NULL,
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `tags_used`
--

INSERT INTO `tags_used` (`name`, `used`) VALUES
('tag_one', 10),
('tag_three', 10),
('tag_two', 10);

这里是php代码:

<?php

$mysqli = new mysqli('127.0.0.1', 'root', 'pass', 'test');
if ($mysqli->connect_error) {
    echo 'Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error;
}
else {
    $query = <<<SQL
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_one' AND `tags`.`id` = '1';
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_one';
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_two' AND `tags`.`id` = '1';
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_two';
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_three' AND `tags`.`id` = '1';
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_three';
SQL;

    $query = trim($query);
    $mysqli->multi_query($query);
    $mysqli->close();
}

?>

执行后'tag_three'仍在tags表中。
当我通过 phpmyadmin 运行此 SQL 时,它运行良好。
我哪里错了?


mysql 5.1.42
php 5.3.1
视窗 2003
nginx 0.8.32


MySQL.log

C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld, Version: 5.1.42-community-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time                 Id Command    Argument
100821 12:25:52     1 Connect   root@localhost on test
            1 Query DELETE FROM `tags` WHERE `tags`.`name` = 'tag_one' AND `tags`.`id` = '1';
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_one';
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_two' AND `tags`.`id` = '1';
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_two';
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_three' AND `tags`.`id` = '1';
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_three'
100821 12:27:37     2 Connect   root@localhost on 
            2 Query SET CHARACTER SET 'utf8'
            2 Query SET collation_connection = 'utf8_general_ci'
            2 Query SHOW PLUGINS
            2 Init DB   test
            2 Init DB   test
            2 Query SELECT * FROM `tags`
 LIMIT 0, 30
            2 Query SHOW TABLE STATUS FROM `test` LIKE 'tags%'
            2 Query SELECT COUNT(*) FROM `test`.`tags`
            2 Init DB   test
            2 Init DB   test
            2 Query SHOW VARIABLES LIKE 'profiling'
            2 Query SHOW FULL COLUMNS
        FROM `test`.`tags`
            2 Quit  

1 Connect - 这是我的代码
2 Connect - 这是来自 phpmyadmin 的“刷新”


php 日志中没有错误。


它是支持代码。照原样。这段代码前后没有任何查询。

【问题讨论】:

  • SQL 很好,所以 multi_query 中肯定有一些我不精通的东西,或者您有一些其他查询可能会将它添加回 db。
  • 似乎php.net/manual/en/mysqli.multi-query.php 可能有一些怪癖...查看 cmets。另外,检查“max_allowed_pa​​cket”的东西
  • 它适用于我:Ubuntu 10.04; MySQL 5.1.41-3ubuntu12.6; PHP 5.3.2-1ubuntu4.2; Apache/2.2.14
  • 将这六个查询打包成一个字符串而不是一个一个发送六个查询有什么好处吗?
  • 它是支持代码。照原样。这段代码前后没有任何查询。

标签: php mysqli phpmyadmin


【解决方案1】:

您应该检查您的错误日志并在此处发布其中的一部分吗?因为这似乎是多查询功能的一个怪癖。我用几乎相同的配置(除了操作系统,win server 2008)尝试了你的代码,它工作正常。我也试过把它修改成六个不同的查询,它也有效。

我尝试将查询更改为以下内容:

  $query = <<<SQL
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_one' AND `tags`.`id` = '1';
COMMIT;
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_one';
COMMIT;
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_two' AND `tags`.`id` = '1';
COMMIT;
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_two';
COMMIT;
DELETE FROM `tags` WHERE `tags`.`name` = 'tag_three' AND `tags`.`id` = '1';
COMMIT;
UPDATE `tags_used` SET `used` = used-1 WHERE `tags_used`.`name` = 'tag_three';
COMMIT;
SQL;

希望对你有用

【讨论】:

  • 我添加了mysql日志。而且php日志一目了然。看看我的查询末尾没有半列(;),也没有“退出”命令。看起来不太好。
  • 我迷路了......因为它是 InnoDB,你可以尝试将查询更改为我在上面编辑过的那个......它对我有用
猜你喜欢
  • 2020-11-29
  • 1970-01-01
  • 2011-06-20
  • 2018-12-09
  • 1970-01-01
  • 2018-05-23
  • 2018-12-09
  • 2017-05-26
  • 2018-11-22
相关资源
最近更新 更多