2009-09-17 12 views
2

Le bloc de code suivant fonctionne très bien (sans erreurs)AOP agit différentes sur deux -very- requêtes similaires

$query = "select * from users where username = ?"; 
$statement = $sql->prepare($query); 
echo gettype($statement); // -- This returns 'object' 
$statement->bindParam(1, $username); 

Le tableau suivant indique: Erreur fatale: Appel à une fonction de membre bindParam() sur un non-objet dans /file.php en ligne 39

$email = '[email protected]'; 
$query = "select * from users where email = ?"; 
$statement = $sql->prepare($query); 
echo gettype($statement); // -- this returns 'boolean' 
$statement->bindParam(1, $email); // -- this is line 39. 

maintenant, c'est étrange.

Sur mon ordinateur local et mon hôte distant, cela n'a jamais été un problème.

Ces erreurs n'apparaissent que sur cette nouvelle société d'hébergement que j'essaie pour le mois. Pourrait-il être un paramètre de configuration quand ils ont compilé PHP?

-------- modifier -------- Tout en essayant toujours de comprendre ce qui ne va pas, j'ai découvert cela.

$query = "select userID, username from users"; 
$statement = $sql->prepare($query);  
$statement->execute(); 
$r = $statement->fetchAll(PDO::FETCH_ASSOC); 

// display # of rows 
echo "Rows returned: " . $statement->rowCount(); 

// display results array 
echo '<pre>'; print_r($r); echo '</pre>'; 

Sur un serveur, je reçois

Rows returned: 4 

Array 
(
    [0] => Array 
     (
      [userID] => 1 
      [username] => lyrae 
     ) 

    [1] => Array 
     (
      [userID] => 2 
      [username] => jproffer 
     ) 

    [2] => Array 
     (
      [userID] => 3 
      [username] => king 
     ) 

    [3] => Array 
     (
      [userID] => 4 
      [username] => gergy 
     ) 

) 

Ce qui est correct. Dit 4 lignes retournées et affiche le tableau de résultats. Sur un autre serveur cependant, je reçois

Rows returned: 0 

Array 
(
    [0] => Array 
     (
      [userID] => 1 
      [username] => lyrae 
     ) 

    [1] => Array 
     (
      [userID] => 2 
      [username] => jproffer 
     ) 

    [2] => Array 
     (
      [userID] => 3 
      [username] => king 
     ) 

    [3] => Array 
     (
      [userID] => 4 
      [username] => gergy 
     ) 

) 

Ainsi, il semble aussi que PDOStatement :: rowCount() ne fonctionne pas sur un sever mais fonctionne sur un autre.

+0

Avez-vous essayé de vérifier le '$ sql> errorInfo()' après la requête échoue? La plupart du temps, cela va pointer directement sur le problème. – flussence

+0

Tableau ([0] => 00000) – sqram

+0

Avez-vous appelé cela avant ou après le bindparam? – jmucchiello

Répondre

1

Une solution au problème a été trouvée.

C'est tout le bloc de code ..

// check if username exists 
$query = "select * from users where username = ?"; 
$statement = $sql->prepare($query); 
$statement->bindParam(1, $username); 
$statement->execute(); 


// check if email exists 
$sql2 = new PDO('mysql:host=localhost; dbname=db', 'username', 'pw'); 
$query = "select * from users"; 
$statement = $sql2->prepare($query); 
echo gettype($statement); 
#$statement->bindParam(1, $email); 

Donc, pour une raison quelconque, je dois créer une nouvelle instance de PDO. ce qui est étrange c'est que sur 2 autres serveurs, je n'ai pas à faire ça.

Et en regardant plus loin, j'ai trouvé que PDO :: Prepare soulève une PDOException.

Ici, il est:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. 

Array 
(
    [0] => HY000 
    [1] => 2014 
    [2] => Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. 
) 

Peut-être que ça va aider quelqu'un à l'avenir :)

0

Est-ce que $ email n'est pas défini? Vous pouvez essayer un var_dump ($ email) aussi voir ce qu'il dit. Bonne chance.

+0

Même si je fais $ email = 'quelque chose' juste au-dessus du bloc, j'ai toujours les mêmes résultats. – sqram

+0

Oh, en regardant à nouveau l'erreur, il semble que le problème doit être avec $ statement (et le fait que dans la production, il est booléen). Je pense que $ sql-> prepare() renvoie false si une erreur est survenue, donc vous pouvez y jeter un coup d'oeil. Probablement un problème de connexion à la base de données. –

0

Avez-vous essayé de mettre la ligne $email= sous la bindParam (mais avant de l'exécuter)? bindParam transmet le paramètre par référence afin que vous puissiez l'exécuter en tant que requête, modifier la valeur de la variable et l'exécuter à nouveau.

Je pense que c'est probablement une erreur d'installation de PHP. J'ai entendu des gens dire que PDO avait beaucoup de bogues avant PHP 5.3, alors peut-être voir si vous pouvez obtenir PHP jusqu'à la dernière version?

Avez-vous également essayé d'échanger les deux requêtes? Peut-être que quelque chose se brise après l'exécution d'une requête.

+0

Même si je n'ai que le bloc de requête par e-mail sur une page, cela ne fonctionne pas. Donc, l'ordre d'où il est comparé à un autre code sur une page ne fait pas de différence. Merci pour l'info sur PDO avant 5.3. Je cours 5.2.6, alors peut-être que cela pourrait être pourquoi. Bien que mon hôte actuel utilise 5.2.9 a croire, et cela fonctionne bien. Je vais leur demander de passer à la version 5.3 et de voir ce qui se passe. Merci! – sqram

0

Je ferais mieux recommandons d'utiliser ce:

$email = '[email protected]'; 
$query = "select * from users where email = ?"; 
$statement = $sql->prepare($query); 
$statement->execute(array($email)); 

Aucune utilisation de BindParam est nécessaire ici.

+0

Hors sujet pour la question. – itpastorn

2

Lire ceci: $statement->closeCursor()

PDOStatement::closeCursor() frees up the connection to the server so that other SQL statements may be issued

Utilisez-vous la même base de données sur le serveur où vous dites que vous n'avez pas ce problème?

+0

Oui, je suis. C'est un script d'inscription et je demande simplement de voir si le nom d'utilisateur existe, et puis je demande à nouveau pour voir si l'email existe sur le tableau des 'utilisateurs'. – sqram

+0

Et ils utilisent tous la même version de PHP? Toutes les bibliothèques sont les mêmes? – jmucchiello

0

J'ai eu le même problème avec echo "Rows retourné:". $ statement-> rowCount();

J'ai obtenu -1 lignes, lol. Ma base de données est INFORMIX et recherche web j'ai trouvé que rowCount(); renvoie uniquement les lignes affectées dans une instruction DELETE, INSERT ou UPDATE exécutée par l'objet PDOStatement correspondant.

Avec une instruction SELECT, vous devez utiliser la fonction $ instruction-> fetchColumn();

lire ici: http://www.phpbuilder.com/manual/en/function.pdostatement-rowcount.php

Questions connexes