Page 1 sur 2

fonction pdo-mysql

Posté : 03 juin 2013, 15:10
par Cypher_PHP
Bonjour

je fais un test en comparant les deux méthodes juste pour voir si ça marche
- sans fonction
- avec fonction

pour l'instant, la méthode sans fonction fonctionne bien et l'autre méthode avec fonction ne fonctionne pas du tout
je ne vois pas le problème sauf étourderie...
je ne sais pas pourquoi
merci beaucoup de votre aide

voici le code sans fonction
$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM mylogs";
$stmt = $db->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
while( $row = $stmt->fetch() ){
	echo $row['id'].'-'.$row['uid'].'<br />';
}
voici le code avec fonction
$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
function select_mylogs_admin_all(){
	global $db;
        $sql = "SELECT * FROM mylogs";
	$stmt = $db->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
	$stmt->execute();
	$result = array();
	while( $rows = $stmt->fetch()){
		$result[] = $rows;
	}
	return $result;
}

$rows = select_mylogs_admin_all();
foreach ($rows as $row) {
		echo $row->id;
}

Re: fonction pdo-mysql

Posté : 03 juin 2013, 21:00
par moogli
salut,


le globals c'est le mal passe l'objet pdo en paramètre de la fonction.

ensuite tu utilise echo $row->id; alors que tu demande un tableau associatif $stmt->setFetchMode(PDO::FETCH_ASSOC);


Tu peux utiliser fetchAll() plutôt que ta boucle while ;)

@+

Re: fonction pdo-mysql

Posté : 04 juin 2013, 11:06
par Cypher_PHP
désolé car je n'ai pas compris

Je relis plusieurs fois les tutoriaux

Re: fonction pdo-mysql

Posté : 04 juin 2013, 11:34
par ghost5922
Bonjour,

qu'est ce que tu n'as pas compris ? le passage de paramètre ou le faite de lui demande a pdo un retour tableau ?

pour le passage de paramètre il suffi de mettre $db dans le paramètre de ta function

select_mylogs_admin_all($db); dans ta function et a l'appelle de celle-ci

pour le retour tableau

ici echo $row->id; tu veux récupérer un objet mais ici $stmt->setFetchMode(PDO::FETCH_ASSOC); tu lui demande un retour en tableau $row['id']

Re: fonction pdo-mysql

Posté : 04 juin 2013, 12:04
par Cypher_PHP
Merci pour vos réponses rapides.

Je n'avais pas pensé à placer le $db dans le paramètre de la fonction.

ce que je n'ai pas compris c'est le retour en tableau
voici mon code corrigé mais cela ne fonctionne toujours pas. je remarque que dès que la boucle commence, la page s'arrête brutalement.
	
function select_mylogs_admin_all($db){

        $sql = "SELECT * FROM mylogs";
	$stmt = $db->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
	$stmt->execute();

        $result = array();
	while( $rows = $stmt->fetchAll() ){
			$result[] = $rows;
		}
	return $result;
}
$rows = select_mylogs_admin_all($db);
foreach ($rows as $row) {
            echo $row['id'];
 }

Re: fonction pdo-mysql

Posté : 04 juin 2013, 12:12
par ghost5922
Bonjour,

regarde ce lien http://php.net/manual/fr/pdostatement.fetchall.php

car pour le moment tu mélange un peu les deux

sinon test voir si cela te convient
function select_mylogs_admin_all($db){
        $sql = "SELECT * FROM mylogs";
        $stmt = $db->prepare($sql);
		$stmt->execute();
		$result = $stmt->fetchAll();
		return $result;
}

$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$rows = select_mylogs_admin_all($db);
foreach ($rows as $row) {
                echo $row['id'].'<br />';
}

Re: fonction pdo-mysql

Posté : 04 juin 2013, 12:29
par Cypher_PHP
donc si je comprend bien, pour récupérer tout le jeu de résultats, j'utilise la fonction fetchAll avec pour valeur par défaut PDO::FETCH_BOTH, c'est vien ça?
	function select_mylogs_admin_all($db){

        $sql = "SELECT * FROM mylogs";
		$stmt = $db->prepare($sql);
		$stmt->execute();

        $result = array();
		while( $rows = $stmt->fetchAll() ){
					$result[] = $rows;
				}
		return $result;
	}
$rows = select_mylogs_admin_all($db);
foreach ($rows as $row) {
    echo $row['id'];
}

Re: fonction pdo-mysql

Posté : 04 juin 2013, 12:37
par ghost5922
tu as pu besoin de ta boucle
$result = array();
                while( $rows = $stmt->fetchAll() ){
                                        $result[] = $rows;
                                }
                return $result;
        }
$stmt->fetchAll() te renvoi deja un tableau donc juste a return $stmt->fetchAll();

après je connais pas beaucoup cette class PDO mais il a plusieurs possibilité de sortir les données :)

donc faut juste voir comment tu veux les récupérés et ce que tu veux en faire

ps : le code que j'ai poster plus haut ne marche pas ?

Re: fonction pdo-mysql

Posté : 04 juin 2013, 15:47
par moogli
il y a moyen de faire simple et clair
<?php
function select_mylogs_admin_all(PDO $db) {
    if($db != null && is_a($db,'PDO')){
        $result = $db->query('SELECT * FROM mylogs');
        if($result !== false){
            return $result->fetchAll(PDO::FETCH_ASSOC);
        }
        else {
            // traitement de l'erreur
            $err = $db->errorInfo();
            echo 'Erreur sQL : '.$err[2];
            return [];
        }
    }else {
        //traitement de l'erreur
        return [];
    }
}

$rows = select_mylogs_admin_all($db);
foreach ($rows as $row) {
    echo $row['id'].'<br />';
}
il faut ajouter une gestion correcte des erreurs.

Ceci n'est utile que si tu compte utiliser cette requête plus d'une fois.

J'ai ajouter un "double" contrôle sur le type de l'objet suivant ta version de php le premier peu poser problème :mrgreen: (typage de l'argument de la fonction).

@ghost5922 : PDO c'est natif php et une bonne pratique si tu veux faire de la POO (l'abstraction de la base de donnée est déja fait tu n'as pas besoin de le refaire).

@+

Re: fonction pdo-mysql

Posté : 04 juin 2013, 15:59
par ghost5922
@Moogli comme deja dit j'utilise une class pour faire mes requêtes sql mais il est vrai que cela me ferai pas de mal de test PDO encore merci pour tes lumières

Re: fonction pdo-mysql

Posté : 04 juin 2013, 16:01
par Cypher_PHP
cela donne une page blanche .....

Re: fonction pdo-mysql

Posté : 04 juin 2013, 16:07
par moogli
donc tu n'a pas de résultat et au pif le premier test échoue vue que tu n'a rien d'afficher .

Merci d'effectuer un minimum de debuggage :D

@+

Re: fonction pdo-mysql

Posté : 04 juin 2013, 16:16
par Cypher_PHP
Moogli

c'est ta fonction qui fait ca ;)
pour info, j'utilise les requêtes préparées

Re: fonction pdo-mysql

Posté : 04 juin 2013, 17:18
par moogli
"ma" fonction ne retourne rien qu'a deux endroit.
dans le premier il y un message qui est affiché, donc si tu ne le trouve pas c'est qu'il n'y en a pas (à moins qu'il soit mêlé a du code html, mais la du coup c'est ce que tu a avant qu'il faut vérifier avant toute chose).
Soit l'objet $db n'est pas un objet PDO. Si tu n'a pas touché a mon code c'est que tu passe null.

si c'est le cas c'est que la connexion est foireuse ?

Pour debugguer, comme indiqué dans le lien de mon message précédent tu peux utiliser print_r ou var_dump (le second de préfrence) pour afficher le contenu des variables.
tu peux aussi utiliser un ide et un debugguer (xdebug ou zend debug avec éclipse par exemple).

le code est syntaxiquement correct après le n'ai pas tes données je en peux tester.


Il est aussi possible que la requête ne retourne rien, pour en être sur test la avec un client mysql.


@+

Re: fonction pdo-mysql

Posté : 05 juin 2013, 09:58
par Cypher_PHP
Bonjour

D'abord, je tiens à vous remercier d'avoir essayé de m'aider à résoudre.

Je rappelle que lors de mon premier post, j'ai notifié que le code suivant fonctionne correctement
$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM mylogs";
$stmt = $db->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
while( $row = $stmt->fetch() ){
        echo $row['id'].'-'.$row['uid'].'<br />';
}
donc la requête MySQL est correcte ainsi que la syntaxe HTML et la connexion PDO.
Mais bon, je vérifie avec des var_dump et aussi je vais tester cette fonction à d'autres sites.

à tout à l'heure