2010-05-21 10 views
1

OK, je suis déconcerté. J'essaie d'exécuter une requête sur une base de données (localement) et j'obtiens une erreur de réinitialisation de connexion. J'ai utilisé la méthode ci-dessous dans une classe DAO générique pour créer une chaîne de requête et passer à l'API Zend_Db. Jusqu'ici, cela a bien fonctionné - les erreurs se produisaient depuis que nous avions généré de nouvelles tables pour enregistrer l'entrée de l'utilisateur. La chaîne d'insertion ressemble à ceci:Connexion Réinitialiser sur requête MySQL

INSERT INTO tablename(`id`,`title`,`summary`,`description`,`keywords`,`type_id`,`categories`) VALUES ('5539','Sample Title','Sample content',' 
\'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue ullamcorper nec. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam vel elit libero. Vestibulum in turpis nunc.\'','this,is,a,sample,array',1,'category title') 

Voici les paramètres, il devient avant l'assemblage de la requête (var_dump):

array 
    'id' => string '1' (length=4) 
    'title' => string 'Sample Title' (length=12) 
    'summary' => string 'Sample content' (length=14) 
    'description' => string '<p>'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue'... (length=677) 
    'keywords' => string 'this,is,a,sample,array' (length=22) 
    'type_id' => int 1 
    'categories' => string 'category title' (length=43) 

Le prochain port d'escale vérifiait les limites de la table, puisqu'il semble insérer si la longueur de "description" est autour de la marque 300 (il varie entre 310 - 330). La limite de champ est définie sur VARCHAR (1500) et la validation sur ce champ ne permettra pas de dépasser plus de 1200 avec HTML, 800 sans.

Le vrai kicker est que si je prends cette chaîne sql et l'exécute via la ligne de commande, cela fonctionne bien - donc je ne peux pas pour la vie de moi comprendre ce qui ne va pas.

J'ai essayé d'étendre les paramètres du serveur à savoir Unexpected Connection Reset: A PHP or an Apache issue?

Ainsi, en quelques mots, je suis perplexe. Des idées?

Répondre

1

OK, pour toute personne rencontrant ce problème - le problème est lié à Zend_Db_Statement - ou plutôt à la bibliothèque preg sur laquelle repose ce composant. Il a été marqué dans le suiveur de problèmes de Zend: http://framework.zend.com/issues/browse/ZF-8399, mais ce n'est pas strictement un problème avec la librairie Zend. Vous pouvez ou ne pouvez pas rencontrer ce problème selon votre environnement de serveur. Dans mon cas, cette erreur sur:

Win XP, Wamp 2 PHP 5.3

Il peut être résolu en utilisant

db->getConnection()->exec($sql) 

qui exécute efficacement le sql directement via l'adaptateur (AOP etc). Alternativement, vous pouvez modifier votre serveur pour rectifier segfaulting dans PCRE lui-même (bien que j'avoue que je ne suis pas entièrement sûr de la façon dont vous vous y prendrez). Hope qui aide quelqu'un d'autre avec le même problème

+0

Merci beaucoup, m'a aidé! :) Btw, cela devrait être '$ db-> getConnection() -> exec ($ sql)' – Znarkus

+0

thx! J'ai modifié la syntaxe – sunwukung

0

Pourriez-vous publier un message d'erreur exact ($ this-> db-> errorInfo() si vous utilisez PDO)? Etes-vous sûr que la connexion db est établie?

+0

la connexion se réinitialise, donc je n'ai aucune sortie de script – sunwukung

+0

et que se passe-t-il si vous définissez PDO :: ERRMODE_SILENT sur false? –

+0

non, meurt toujours. Si je crée une nouvelle instance de PDO, c'est bien, c'est à chaque fois qu'elle touche l'adresse Zend_API qu'elle casse. – sunwukung

0

Pour ceux qui googler et trouver ce post sur réinitialisation de connexion lorsque vous effectuez la requête MySQL:

A part la réponse de sunwukung, s'il vous plaît vérifier également que s'il y a une bouteille -neck dans votre paramètre MySQL, en particulier celui-ci:

max_allowed_packet = 1M 

Vous pouvez le changer à un plus grand nombre. Voici le mien:

max_allowed_packet = 32M 

Maintenant, cela fonctionne.

Explication:

Comme vous pouvez le lire à partir du nom du paramètre, réinitialisation de la connexion est principalement le résultat d'une trop grande ensemble de données qui entrent et sortent de MySQL, qui « Terminate » la connexion à MySQL.