2010-08-20 68 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