OVH Community, votre nouvel espace communautaire.

Connexion mysql impossible (depuis le ZendFramework)


Gaston_Phone
08/05/2011, 14h40
Citation Envoyé par Mentalo
... Mais j'aimerais bien connaître la cause réelle du problème
Moi aussi.

Mentalo
08/05/2011, 14h12
Suite à des tests effectués avec Gaston, nous avons vu que la connexion se faisait bien si on n'utilise pas l'adapter du ZF, en mettant ce _initDb() :

protected function _initDb()
{
$configuration = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV);
$dbAdapter = Zend_Db::factory($configuration->resources->db);

$DB_host = $configuration->resources->db->params->host;
$DB_user = $configuration->resources->db->params->username;
$DB_pass = $configuration->resources->db->params->password;

$fh_db = mysql_connect($DB_host, $DB_user, $DB_pass);
$sel = mysql_select_db($DB_user, $fh_db);

// $dbAdapter->getConnection()->exec("SET NAMES 'utf8'");
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapt er);
}
Le problème se situe apparemment sur l'adapter. D'après le forum de Zend, le problème se situerait du côté de l'adapteur et de la méthode Zend_Db_Adapter_Abstract::getConnection(), qui perdrait ou écr&aserait les paramètres d'identification.

Donc là où j'en suis, la connexion fonctionne et me permet de faire tourner le site (ouf, merci Gaston !). Mais j'aimerais bien connaître la cause réelle du problème

Mentalo
08/05/2011, 10h56
Dernière erreur obtenue :

Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /homez.17/monlogin/application/models/maclasse.php on line 47

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /homez.17/monlogin/application/models/maclasse.php on line 47

bool(false

Gaston_Phone
08/05/2011, 10h30
C'est le jeux du ping-pong.
Peux-tu m'appeler ?

Mentalo
08/05/2011, 10h28
J'ai posté mon problème sur le forum de Zend, et là-bas on me dit que cela vient de l'hébergeur et non du framework... Je tourne en rond !

Gaston_Phone
07/05/2011, 17h28
@ Mentalo : j'ai mis un message sur ton profil.

Mentalo
07/05/2011, 17h27
Oui j'ai essayé ces deux :
SetEnv PHP_VER 5
SetEnv PHP_VER 5_TEST

+ les autres paramètres indiqués par Nowwhat.

Gaston_Phone
07/05/2011, 17h25
As-tu essayé avec SetEnv PHP_VER 5_TEST dans le fichier .htaccess ?

Mentalo
07/05/2011, 17h22
Oui j'ai aussi ouvert un sujet chez eux, c'est là qu'on m'a donné l'idée du PDO pas supporté et des versions de PHP à paramétrer

Le lien en question est ici si vous voulez suivre la discussion.

De toute façon je viendrai apporter la solution quand on l'aura trouvée (j'espère bien qu'on va la trouver !)

Merci pour votre aide et votre patience !

Gaston_Phone
07/05/2011, 17h19
Citation Envoyé par Mentalo
J'ai Resource #id 1. C'est plutôt bon signe non ? Ca signifie que la connexion se fait bien ?
C'est bon en effet. Cela signifie que les codes d'accès utilisés sont OK.

Maintenant le problème n'est plus OVH puisque les codes d'accès sont bons et que tu obtiens une connexion.
Il faut que tu te tournes vers un forum dédié ZendFramework et que tu leur pose la question.

Mentalo
07/05/2011, 17h11
J'ai Resource #id 1. C'est plutôt bon signe non ? Ca signifie que la connexion se fait bien ?

Gaston_Phone
07/05/2011, 17h07
Est-ce les lignes décrites plutôt en #15 ?
Tu dois voir une ligne mysql_connect= ... Que dit-elle ?

Si tu ne voies pas cette ligne, après la ligne "echo " mysql_connect=..." ajoute exit();
et recommence.

Mentalo
07/05/2011, 17h03
Je viens d'ajouter ces lignes (sans bien comprendre de quoi il s'agissait) mais c'est toujours pareil...

Nowwhat
07/05/2011, 16h57
Dans le doc d'OVH on parle de Zend.
Il faut l'activer - tu l'as fait ?
C'est ici: http://guides.ovh.net/ConfigPhp

Mentalo
07/05/2011, 16h52
Si cela fonctionne sur un script simple avec les fonctions mysql_*, et pas depuis Zend, c'est peut-être un problème de PDO ? Dans le phpinfo(), j'ai pdo_mysql à "enabled" (Client API version, 5.0.51a). Mais c'est un serveur mutualisé, de toute façon je n'ai pas la main dessus, à moins de pouvoir passer par le .htaccess.

Je vais effectivement faire des tests depuis le _initDb(), mais je n'ai pas trop quoi tester exactement ? Il existe des fonctions de débugguage des méthodes de connexion ?

Gaston_Phone
06/05/2011, 09h06
OK, on va dans le bon sens. L'exécution de mon script est sans erreurs et les requêtes donnent des résultats corrects.

Maintenant, le problème se situe bien dans dans un fichier de configuration de ZendFramework.
Il faudrait, dans protected function _initDbn, ajouter des lignes de codes de trace pour afficher les résultats intermédiaire et déterminer ainsi plus finement la cause de l'erreur.

Mentalo
06/05/2011, 07h31
J'ai déjà mis ce code, je ne comprend pas ce que je dois ajouter ? Je dois être mal réveillé...

J'ai ceci en résultat :

mysql_connect=Resource id #1 - Erreur=
mysql_select_db=1 - Erreur=
Et ensuite les logs de création des données.

J'ai édité les données de connexion avec un autre éditeur, cela n'a rien changé. J'ai essayé avec des guillemets et sans.

Gaston_Phone
06/05/2011, 06h41
Citation Envoyé par Mentalo
Je me connecte bien sur PhpMyAdmin (depuis les 2 adresses). Le script de test a l'air de fonctionner (avec $DBName = $DBowner ça plante, avec $DBName = "ma vraie valeur" ça passe bien).
Si je comprends bien, avec mon script de test_SQL.php et $DBName = "ma vraie valeur" tu passes le test complètement et avec succès.

A mon humble avis, le problème ne vient pas des outils FTP mais de ton éditeur de texte et/ou du coupé/collé.

Essaie de rajouter dans le script de vBulletin :

Code PHP:
   $DBhost  "mysql5-22.perso";   // Par exemple
   
$DBowner "";  // ton login SQL
   
$DBpw    "";  // ton password SQL
   
$DBName  $DBowner;

      
$fh_db mysql_connect($DBhost$DBowner$DBpw);
      
$Erreur mysql_error();
      echo 
" mysql_connect=".$fh_db." - Erreur="
.mysql_error()." 
 \n"

Mentalo
05/05/2011, 22h08
Je viens d'essayer via Filezilla sur la VM, et avec gFTP, pas de changement.

Mentalo
05/05/2011, 21h52
Je me connecte bien sur PhpMyAdmin (depuis les 2 adresses). Le script de test a l'air de fonctionner (avec $DBName = $DBowner ça plante, avec $DBName = "ma vraie valeur" ça passe bien).

Je reprend ces paramètres dans mon application.ini : ce sont les mêmes puisque Notepad++ colore les chaînes identiques. Et là cela ne passe pas.

C'est pareil avec d'autres navigateurs. Je vais essayer avec d'autres clients FTP.

Gaston_Phone
05/05/2011, 21h40
Utilise un autre navigateur (ex. Safari).
Essaie de te connecter sur ta base à l'adresse : https://pma.ovh.net/ puis à l'adresse https://phpmyadmin.ovh.net/ en prenant les identifiants/mot de passe de mon script de test.

Mentalo
05/05/2011, 21h34
J'ai demandé à une personne de les recopier, parfois à force d'être le nez dedans on commet une erreur sans le voir ! Mais ça n'a rien changé, je met bien les bons identifiants, j'ai mis mon fichier juste à côté du mail d'OVH et ils sont strictement identiques.

Gaston_Phone
05/05/2011, 21h27
Attention aux MAJUSCULES/minuscules des codes d'accès.

Mentalo
05/05/2011, 21h24
C'est ce que j'ai fait, toujours le même résultat...

Gaston_Phone
05/05/2011, 21h09
Ressaie mon script en :
- Faisant un nouveau script avec notepad.exe.
- Recopiant à la main les identifiants de connexion (pas de copier/coller).

Mentalo
05/05/2011, 21h01
J'ai bien ces deux paramètres identiques. Nom copié depuis le nom de la bdd de phpmyadmin :s

Gaston_Phone
05/05/2011, 20h59
Il faut :
resources.db.params.username = resources.db.params.dbname = mabase

Mentalo
05/05/2011, 20h56
Voilà l'erreur que j'obtiens :

Erreur=Access denied for user 'monlogin'@'10.0.98.4' (using password: YES)

Pour info, c'est bien avec ".perso", sans cela j'obtiens "Unknown MySQL server host 'mysql5-22'"

L'erreur survient sur la ligne du mysql_connect(), cela confirme donc l'origine du problème. Seulement je ne pense pas me tromper dans les paramètres 'copier coller des mails reçus d'OVH, et je me connecte bien avec via phpmyadmin). Du coup je ne vois pas bien quoi faire...

Gaston_Phone
05/05/2011, 20h53
Citation Envoyé par Mentalo
Pour le nom du serveur, dois-je mettre "mysql5-22.perso" ou "mysql5-22" ?
Je mettrais mysql5-22.perso.

Mentalo
05/05/2011, 20h41
Merci je teste cela de suite.

Pour le nom du serveur, dois-je mettre "mysql5-22.perso" ou "mysql5-22" ?

Je poste le résultat dans qq minutes

Gaston_Phone
05/05/2011, 20h37
Test de base de données :

Puis-je te suggérer de faire un tout petit script en PHP test_SQL.php, dans lequel tu vas :
- Ouvrir une connexion à ta base,
- Supprimer une table si elle existe,
- Créer une table,
- Faire une requête dans une table,
- Afficher les résultats de ta requête,
- Fermer ta connexion.

Ce script te permettra, indépendamment de tous tes autres scripts, de voir si ta base de données est accessible ou non, ainsi que la durée du traitement.

Peux-tu nous donner le résultat de ce test ? Merci.

test_SQL.php

Code PHP:

   error_reporting
(E_ALL);   // Activer le rapport d'erreurs PHP


function getmicrotime()
   { 
   list(
$usec$sec) = explode(" ",microtime()); 
   return ((float)
$usec + (float)$sec); 
   } 

   
$Date_start getmicrotime();


// ******  Exemples de configuration selon les hébergements mutualisés ******

//   Perso
//   ------
//      $DBhost  = "mysql5-14.perso";
//      $DBowner = "";  // Ton login SQL
//      $DBName  = $DBowner;

//   Pro
//   ---
//      $DBhost  = "mysql5-6.pro";
//      $DBowner = "";  // Ton login SQL
//      $DBName  = $DBowner;

// ******  Fin des exemples de configuration


// ******  Configuration - Debut ******
   
$DBhost  "mysql5-6";   // Par exemple
   
$DBowner "";  // ton login SQL
   
$DBpw    "";  // ton password SQL
   
$DBName  $DBowner;
// ******  Configuration - Fin ******
    

      
$Table_SQL "Tab_test_DB";

      
$fh_db mysql_connect($DBhost$DBowner$DBpw);
      
$Erreur mysql_error();
      echo 
" mysql_connect=".$fh_db." - Erreur="
.mysql_error()." 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
$sel mysql_select_db($DBName$fh_db);
      echo 
" mysql_select_db=".$sel." - Erreur=".mysql_error()." 
 
\n";

      echo 
" Test de DROP/CREATE de la table '.$Table_SQL"' dans la base '.$DBName"' sur le serveur '.$DBhost"
  
";

      
//  Supression de la table Tab_test_DB

      
$sql_query="DROP TABLE IF EXISTS `Tab_test_DB` ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"Supression de la table Tab_test_DB - Erreur=".mysql_error()." - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
//  Création de la table Tab_test_DB

      
$sql_query="CREATE TABLE `Tab_test_DB` (  `Id` int(11) NOT NULL auto_increment,  `NOM` varchar(32) NOT NULL default '',  `PRENOM` varchar(32) NOT NULL default '', PRIMARY KEY  (`Id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"Création de la table Tab_test_DB- Erreur=".mysql_error()."  - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
//  Ajout d'un Premier enregistrement

      
$sql_query="INSERT INTO `Tab_test_DB`  values ('','DURANDAL','Michel')  ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"Ajout d'un enregistrement - Erreur=".mysql_error()." - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
//  Ajout d'un Deuxième enregistrement

      
$sql_query="INSERT INTO `$Table_SQL`  values ('','DURANDAL','Pierre')  ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"Ajout d'un enregistrement - Erreur=".mysql_error()." - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
//  Ajout d'un Troisième enregistrement

      
$sql_query="INSERT INTO `Tab_test_DB`  values ('','accents-éèàâ','Jean-Noël')  ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"Ajout d'un enregistrement - Erreur=".mysql_error()." - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
//  SELECT dans la table Tab_test_DB : NOM='DURANDAL'

      
$sql_query="SELECT Id, NOM, PRENOM FROM `Tab_test_DB` WHERE NOM='DURANDAL' ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"SELECT dans la table Tab_test_DB  - Erreur=".mysql_error()." - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      
//  SELECT dans la table Tab_test_DB : tous les enregistrements

      
$sql_query="SELECT Id, NOM, PRENOM FROM `Tab_test_DB` ";    // Requête
      
$result_query=mysql_query($sql_query);     // Exécution de la requête
      
$Erreur mysql_error();
      echo 
"SELECT dans la table Tab_test_DB  - Erreur=".mysql_error()." - \$sql_query=$sql_query - \$result_query=$result_query 
 \n";
      if (
strlen($Erreur) > 0)   exit;
      
$result_count_row_get mysql_num_rows($result_query);  
      
$Erreur mysql_error();
      echo 
" Nombre d'enregistrements trouvés = $result_count_row_get 
 \n";
      if (
strlen($Erreur) > 0)   exit;

      if (
$result_query)
         {
         
$Count 0;
         while (
$result_query && $row=mysql_fetch_array($result_query)) 
            { 
            
$Count     $Count 1;
            
$NOM       $row['NOM'];
            
$PRENOM    $row['PRENOM'];
            echo 
" Table  Tab_test_DB : ".$Count." - \$NOM=".$NOM." - \$PRENOM=".$PRENOM." 
 \n";
            }
         }

      
// Fermeture de la connexion    
      
mysql_close($fh_db);                                 


      
$Date_end getmicrotime();
      
$Duree $Date_end $Date_start;
      
$Duree sprintf("%01.2f"$Duree);

      echo 

  Durée du traitement = 
$Duree secondes 
 \n";
?>

Mentalo
05/05/2011, 20h25
Bonjour,

Je sèche depuis plusieurs sur une erreur, je pense que cela vient de la connexion au serveur mysql d'OVH (l'erreur se produit à chaque requête).

- La base de données est installée et contient des données
- J'ai bien mis SetEnv PHP_VER 5 dans le .htaccess

Un bout de mon Bootstrap :
Code:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{  
    protected function _initDb()
    {
        $configuration = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV);
        $dbAdapter = Zend_Db::factory($configuration->resources->db);
        // $dbAdapter->getConnection()->exec("SET NAMES 'utf8'"); // KO si décommenté
        Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
    }
}
Mon application.ini (avec dbname = username) :
Code:
; - database
resources.db.adapter                            = Pdo_Mysql
resources.db.params.host                        = "mysql5-22.perso"
resources.db.params.username                    = monlogin
resources.db.params.password                    = monmotdepasse
resources.db.params.dbname                      = mabase
resources.db.params.charset                     = "UTF8"
Le fait que le script plante quand je fais le $dbAdapter->getConnection()->exec("SET NAMES 'utf8'") me laisse à penser que la connexion n'est pas opérationnelle. Mais je n'ai aucun message d'erreur.

J'ai cherché sur le web, je n'ai pas trouvé de réponse qui corrige ce problème. J'ai aussi consulté la doc d'OVH, mais je n'ai pas de renseignement comme "sql1" ou "sql9" (j'ai testé avec "mysql5-22.perso" et "mysql5-22".

Merci d'avance pour votre aide.