2010-08-20 14 views
0

J'ai un 'test' de base de données avec deux tables.multi_query in php

est ici dump 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); 

Et voici le code 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(); 
} 

?> 

Après l'exécution 'tag_three' est encore dans le tableau tags.
Et quand je lance ce SQL via phpmyadmin cela fonctionne très bien.
Où est-ce que je me trompe?


MySQL 5.1.42
php 5.3.1
windows 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 Connectez - Il est mon code
2 Connect - Il est 'Actualiser' de phpmyadmin


Il n'y a pas d'erreurs dans les journaux php.


Il s'agit d'un code standard. Comme si. Il n'y a pas de requêtes avant ou après ce code.

+1

Le SQL est bien il doit y avoir quelque chose dans multi_query, que je ne suis pas versé dans, ou vous avez une autre requête qui pourrait l'ajouter à la base de données. – Hans

+0

On dirait que http://php.net/manual/fr/mysqli.multi-query.php pourrait avoir quelques bizarreries ... consultez les commentaires. Aussi, vérifiez que "max_allowed_packet" chose – Hans

+0

Cela fonctionne correctement pour moi: Ubuntu 10.04; MySQL 5.1.41-3ubuntu12.6; PHP 5.3.2-1ubuntu4.2; Apache/2.2.14 – Mike

Répondre

0

Vous devriez vérifier votre journal des erreurs et en poster peut-être une partie ici? Parce qu'il semble une bizarrerie de la fonction multi-requête. J'ai essayé votre code avec une configuration presque identique (à l'exception de l'os, win server 2008) et cela a fonctionné. J'ai également essayé de le modifier en six requêtes différentes, et cela a également fonctionné.

J'ai essayé de changer la requête en ce qui suit:

$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; 

espérons que cela fonctionne pour vous

+0

J'ai ajouté mysql log. Et php log est clair. Regardez il n'y a pas de semicolumn (;) à la fin de ma requête et il n'y a pas de commande 'Quitter' aussi. Ça ne semble pas bien. – Sladex

+0

Je suis à perdu ...puisque c'est InnoDB, vous pouvez essayer de changer la requête dans celle que j'ai éditée ci-dessus .. cela a fonctionné pour moi – ZaQ