Une seule requete PDO avec 2 bases de donnees MySQL

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 juil. 2011, 04:58

globalement oui http://www.php.net/manual/fr/pdo.quote.php

juste comme ça, pour une chaine (PDO::PARAM_STR) tu peux ne pas préciser le type puisse que c'est celui par défaut
string PDO::quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
après tu peux le laisser, au moins tu sera homogène avec les autres types et ça permet de bien voir ce que tu fait :)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

31 juil. 2011, 06:54

Si je voulais la mettre en class, afin d'utiliser celle que je voudrais ulterieurement, est ce que je peux la mettre comme ca:
public function queryQuoted($value, $param)
                {
                    $this->value = $value;
                    $this->param = $param;
                    return $this->connexion->quote($this->value, $this->param);
                }
                
                public function queryRun($requete)
                {
                    $this->requete = $requete;
                    $this->connexion->query($this->requete);
                }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 juil. 2011, 08:03

heu oui si tu veux, mais bon c'est un peux réinventer la roue ton truc la, autant faire hériter ta classe de PDO c'est plus simple.

le système d'héritage en poo (pour php)

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

31 juil. 2011, 08:47

je vais utiliser l'heritage juste apres bien former mes requetes, j'ai utilise ce code mais il ne retourne rien:
<?php

// class connection

           public function queryQuoted($value, $param)
                {
                    $this->value = $value;
                    $this->param = $param;
                    return $this->connexion->quote($this->value, $this->param);
                }
                
                public function queryRun($requete)
                {
                    $this->requete = $requete;
                    $con = $this->connexion->query($this->requete);
                    echo $this->requete;
                    return $con;
                    
                }

// utilisation
$onoffVal = 1;
$onoffVal = $PDOConnect->queryQuoted($onoffVal, PDO::PARAM_INT);
$arrAll = $PDOConnect->queryRun('SELECT * FROM hmenu WHERE location="r" AND onoff="'.$onoffVal.'"');

  echo $arrAll->fetchColumn();

     
?>

Mammouth du PHP | 725 Messages

31 juil. 2011, 15:39

J'ai enleve les doubles guillemets, et ca marche, comment faire pour l'update et insert??
$increment_lis = $PDOConnect->queryQuoted($increment_lis, PDO::PARAM_INT);
$num = $PDOConnect->queryQuoted($num, PDO::PARAM_INT);
$PDOConnect->queryRun('UPDATE table SET heard='.$increment_lis.' WHERE num = '.$num.'');
j'ai utilise aussi exec() et ca me donne l'erreur:
Fatal error: Call to undefined method PDOConnexion::exec()
$PDOConnect->exec('UPDATE table SET heard='.$increment_lis.' WHERE num = '.$num.'');

Mammouth du PHP | 725 Messages

01 août 2011, 09:29

j'aimerais bien finir ce probleme, ni avec prepare ni avec exec ni query marche le code, c'est quoi le probleme??

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 août 2011, 14:04

hum,
l'héritage ou non c'est à la conception qu'il faut le prévoir, après c'est trop tard ;)

exemple d'héritage (bidon hein ;) )
class test extends PDO {
    public final function  __construct($dsn, $username, $passwd, $options=null) {
        parent::__construct($dsn, $username, $passwd, $options);
    }

    public final function humf(){
        $x = $this->prepare('select * from users where id= :iduser');
        $a = $x ->execute(array('iduser' => 1));
        if ($a === false ){
            var_dump($x->errorInfo());
        }
        else {
            $lignes = $a->fetch(PDO::FETCH_OBJ);
            echo $lignes->pseudo.'<br />';
            echo $lignes->mdp.'<br />';
            echo $lignes->mail.'<br />';
            echo $lignes->active.'<br />';
        }
    }
}

$sgbdCon = array (
    'db_type'  => 'mysql',
    'db_host'  => 'localhost',
    'db_user'  => 'root',
    'db_pwd'   => 'yyRu2TKEvyYpzFLK',
    'db_name' => 'test'
);

$zaz = new test('mysql:host=localhost;dbname=test', $sgbdCon['db_user'], $sgbdCon['db_pwd']);

$zaz->humf();
var_dump($zaz);
?>
tu pourra d'ailleurs constater que cette requête ne peux fonctionner correctement au vu de la requete préparée qui va caster mon int en string :)

avec ça tu a un exemple d'utilisation de classe qui hérite de PDO et comment faire la requête ;)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

02 août 2011, 06:16

je n'utilise pas de class afin de tester ma requete, pourquoi ca ne marche pas meme avec la facon traditionnelle, un autre coup:
$sql = 'UPDATE ';  
try {  
$a = $PDOConnect->query($sql);  
}  
catch(Exception $e)  
{  
echo 'Erreur : '.$e->getMessage().'';  
echo 'N° : '.$e->getCode();  
}  
echo '<pre>',var_dump($PDOConnect->errorInfo()),'</pre><hr />';  
var_dump($a);

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 août 2011, 09:28

je n'utilise pas de class afin de tester ma requete, pourquoi ca ne marche pas meme avec la facon traditionnelle, un autre coup:
$sql = 'UPDATE '; 
try { 
$a = $PDOConnect->query($sql); 
} 
catch(Exception $e) 
{ 
echo 'Erreur : '.$e->getMessage().''; 
echo 'N° : '.$e->getCode(); 
} 
echo '<pre>',var_dump($PDOConnect->errorInfo()),'</pre><hr />'; 
var_dump($a);
heu ben PDO c'est une classe ^^

la avec ton code je suis certainqu'il ne fonctionne pas, une requete sql qui ne contient que UPDATE c'est pas valide manque des chose ;)

le var_dump devrait être dans le catch ;)


envoie ton code complet, prce que la y a que des bout et on s'y perd ('est d'ailleur le problème depuis le début du fil de discution ça se mélange les pinceaux et finlament et ne sais plus trop où ça en est :)

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

02 août 2011, 09:56

voila le code en entier, je n'ai pas encore applique l'heritage:
// la class

class PDOConnexion {
          
        private $db_host, $db_user, $db_passwd, $db_name, $connexion, $errorMessage, $charset;

        
		public function __construct($db_host='', $db_user='', $db_passwd='', $db_name='', $errorMessage='', $charset='')
            {
                $this->db_host = $db_host;
                $this->db_user = $db_user;
                $this->db_passwd = $db_passwd;
                $this->db_name = $db_name;
                $this->errorMessage = $errorMessage;
                $this->charset = $charset;
                
                
                try
                    {
                        $connexion = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name, $this->db_user, $this->db_passwd
			, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $this->charset")); //SET NAMES utf8
			$connexion->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
                    }
					 
			catch(Exception $e)
                            {
                                echo $this->errorMessage .': '.$e->getMessage().'<br />';
				echo 'N: '.$e->getCode();
                                echo 'Cannot connect to '.$db_host.' <br />';
                            }
                                $this->connexion = $connexion;
        }
        
                
    

		public function queryPrep($requete)
		{			
                    $this->requete = $requete;
                    $prep = $this->connexion->prepare($this->requete);
			        $this->prep = $prep;
		}
            
                
        public function queryExec()
		{			
                        $execute = $this->prep->execute();
            			$this->execute = $execute;
		}
     
        public function queryQuoted($value, $param)
        {
            $this->value = $value;
            $this->param = $param;
            return $this->connexion->quote($this->value, $this->param);
        }
                
        public function queryRun($requete)
        {
            $this->requete = $requete;
            return $this->connexion->query($this->requete);
        }


// le code update

$PDOConnect = new PDOConnexion($db_host, $db_user, $db_passwd, $db_name, 'erreur', 'utf8');

$increment_lis = $PDOConnect->queryQuoted($increment_lis, PDO::PARAM_INT);
$num = $PDOConnect->queryQuoted($num, PDO::PARAM_INT);
$sql = $PDOConnect->query('UPDATE table SET heard='.$increment_lis.' WHERE num = '.$num.'');  
try {  
$a = $PDOConnect->query($sql);  
}  
catch(Exception $e)  
{  
echo 'Erreur : '.$e->getMessage().'';  
echo 'N° : '.$e->getCode();  
echo '<pre>',var_dump($PDOConnect->errorInfo()),'</pre><hr />';  
var_dump($a);
}
NB: je l'ai pris d'ici, apres une recherche sur le net :)

Mammouth du PHP | 725 Messages

02 août 2011, 10:15

je pense avoir une faute de saisie, au lieu de mettre la fonction queryRun j'ai mis seulement query, par consequant ca ne fait aucun update, le champs reste le meme :(

Mammouth du PHP | 725 Messages

02 août 2011, 10:38

j'ai constate la raison duquelle la mise a jour ne se fait pas, parce que j'utilise quote, elle ajoute des (') a la requete:
<?php

            $increment_lis = $heard + 1; // on incremente le compteur par 1
            echo '<b>'.$increment_lis.'</b><br>'; // sans les (')
            $increment_lis = $PDOConnect->queryQuoted($increment_lis, PDO::PARAM_INT);
            echo '<b>'.$increment_lis.'</b><br>'; // avec les (')

$sql = 'UPDATE ....';

echo 'nombre: '.$increment_lis.'<br />'; // il affiche '14' avec des (')
?>
comment puis je faire afin d'eliminer les (') apres ma requete

Mammouth du PHP | 725 Messages

03 août 2011, 04:55

est ce que la class est correcte?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 août 2011, 09:50

tu utilise mal ta classe
$PDOConnect = new PDOConnexion($db_host, $db_user, $db_passwd, $db_name, 'erreur', 'utf8');
$increment_lis = $PDOConnect->queryQuoted($increment_lis, PDO::PARAM_INT);
$num = $PDOConnect->queryQuoted($num, PDO::PARAM_INT);
$sql = $PDOConnect->query('UPDATE table SET heard='.$increment_lis.' WHERE num = '.$num.''); <= ça c'est pas bon vu les lignes suivantes :)
try {
$a = $PDOConnect->query($sql); <== ça c'est le pire :)
}
catch(Exception $e)
{
echo 'Erreur : '.$e->getMessage().'';
echo 'N° : '.$e->getCode();
echo '<pre>',var_dump($PDOConnect->errorInfo()),'</pre><hr />';
var_dump($a);
}

a la limite
$sql = 'UPDATE table SET heard='.$increment_lis.' WHERE num = '.$num);
try {
$a = $PDOConnect->query($sql); <== ça c'est le pire :)
}


pour ce qui est de la classe elle est inutile car n'apporte pas d'amélioration ou de fonctionnalité à la classe PDO existante autant ne pas l'utiliser;)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

05 août 2011, 04:30

j'ai utilise la methode traditionnelle et ca genre une erreur:
try
                    {
                        $connexion = new PDO('mysql:host='.$db_host.';dbname='.$db_general, $db_user, $db_passwd
			, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $db_charset")); //SET NAMES utf8
			$connexion->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
                    }
					 
			catch(Exception $e)
                            {
                                echo 'Erreur: '.$e->getMessage().'<br />';
				echo 'N: '.$e->getCode();
                                echo 'Cannot connect to '.$db_host.' '.$db_general.' '.$db_user.' '.$db_passwd.' <br />';
                            }
 
 $sql = 'SELECT * FROM comments WHERE idcat = "1" AND id_cl = "1" ORDER BY idcom DESC LIMIT 10'; 
$req = $connexion->query($sql); 
                      
$result = $arrAll->fetchAll(); 
echo '<p>Cette requête retourne '.count($result)." enregistrements.</p>\n";

Erreur: SQLSTATE[42000] [1115] Unknown character set: 'utf'<br />N: 0Cannot connect to localhost general root pass <br /><br />
<b>Fatal error</b>: Call to a member function query() on a non-object in <b>comments.php</b> on line <b>32</b><br />
alors que l'encodage est et la ligne 32:
$db_charset = 'utf-8';

$req = $connexion->query($sql);