2010-08-20 74 views
0

我有两个表的数据库'测试'。php中的multi_query

这里是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的42年5月1日
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 [email protected] 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 [email protected] 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连接 - 它是我的代码
2连接 - 这是 '刷新' 从phpmyadmin的


PHP中记录没有错误。


它是代码。原样。此代码之前或之后没有任何查询。

+1

的SQL是精细所以一定有什么东西在multi_query,这我不精通,或你有一些其他的查询可能会把它添加到标签回数据库。 – Hans 2010-08-20 10:13:18

+0

似乎http://php.net/manual/en/mysqli.multi-query.php可能有一些怪癖...检查出的意见。另外,看看“max_allowed_pa​​cket”的东西 – Hans 2010-08-20 10:15:58

+0

它适用于我:Ubuntu 10.04; MySQL 5.1.41-3ubuntu12.6; PHP 5.3.2-1ubuntu4.2; Apache/2.2.14 – Mike 2010-08-20 11:03:11

回答

0

你应该检查你的错误日志,也许在这里发布它的一部分?因为它似乎是一个多查询函数的怪癖。我试过你的代码大部分是相同的配置(除了操作系统,赢得服务器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; 

希望它为你工作

+0

我加了mysql日志。而且PHP日志很清晰。看看在我的查询结尾没有半列(;),并且没有“Quit”命令。它看起来不太好。 – Sladex 2010-08-21 06:44:08

+0

我迷路了...因为它是InnoDB,你可以尝试将查询改变成我上面编辑的那个查询..它为我工作 – ZaQ 2010-08-26 12:01:23