2010-10-11 4 views
1

J'apprends actuellement PHP et MySQL. Je viens d'écrire une classe qui gère tout le trafic MySQL, mais je rencontre quelques erreurs.Pourquoi mon instruction PHP préparée pour MySQL ne fonctionne-t-elle pas?

function table_exists($tablename){ 
    // check if table exists 
    $stmt = $this->db->prepare("SHOW TABLES LIKE '?'"); 
    $stmt->bind_param("s", $tablename); //This is line 24. 
    $stmt->execute(); 
    $ar = $stmt->affected_rows; 
    $stmt->close(); 
    if ($ar > 0){ 
     return true; 
    } else { 
     return false; 
    } 
} 

Ce code est le problème, et l'erreur que je reçois est

Attention Génère: mysqli_stmt :: bind_param() [mysqli-stmt.bind-PARAM]: nombre de des variables ne correspond pas à nombre de paramètres dans déclaration préparée dans C: \ xampp \ htdocs \ mail \ datahandler.php en ligne 24

Des idées?

Merci

Répondre

2

Pas besoin d'utiliser des guillemets lorsque vous travaillez avec des instructions préparées.

$stmt = $this->db->prepare("SHOW TABLES LIKE ?"); 

En outre, au lieu de SHOW TABLES, vous pouvez utiliser des vues information_schema, qui vous donnent un peu plus de flexibilité.

+0

Cela signifie-t-il que si je fais cela, je n'aurai pas besoin de la citation non plus? $ query = "SUPPRIMER FROM maillist WHERE id = '?' ET" . "password = 'MOT DE PASSE (?)'"; – Pwnna

+0

Après avoir utilisé votre code, je reçois Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '?' à la ligne 1 – Pwnna

+0

Peut-être que SHOW TABLES ne prend pas en charge les instructions préparées dans la clause LIKE ... Essayez 'SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA =? AND TABLE_NAME =? 'Où' TABLE_SCHEMA' est le nom de votre base de données, et 'TABLE_NAME' est le nom de votre table. – Mchl

2

Vous devez également utiliser un numéro en tant que premier paramètre pour bind_param()

$stmt->bind_param(1, $tablename); 

Voir ici: http://php.net/manual/pdostatement.bindparam.php

Pour les chaînes vous pouvez également passer juste un tableau dans execute().

+0

Mon $ stmt est http://php.net/manual/fr/mysqli-stmt.bind-param.php Je suis assez sûr. – Pwnna

+0

Ok, je ne me suis pas rendu compte que vous utilisez MySQLi, je supposais que vous utilisiez PDO - que je recommande fortement BTW. – DanMan

0
private function table_exists($tablename){ 
     // check if table exists 
     $stmt = $this->db->query("SHOW TABLES"); 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
      $arr[]=$row; 
     } 
     $ar=0; 
     foreach($arr as $val){ 
      foreach($val as $value){ 
       if($value==$tablename) $ar=1; 
      } 
     } 
     unset($stmt); 
     if ($ar == 1){ 
      return true; 
     } else { 
      return false; 
     } 
    } 
Questions connexes