2010-01-26 5 views
2

Je construis une application web qui importe des données à partir de flux de données dans php/mysql. J'importe les données dans une table tampon/temporaire. Comme chaque format de données est différent, je choisis la colonne à sélectionner en fonction de la source particulière.en utilisant des instructions mysqli préparées pour lier des paramètres dans la section SELECT d'une requête

Je ne parviens pas à obtenir cette requête pour travailler dans ce contexte:

$stmt = $this->dbObj->prepare("SELECT mk.PK_phone_maker, b.?, b.phoneDescription 
      b.thumbPic, 
     FROM buffer_table b left join mobile_phone pm on b.? = pm.phoneModel 
      LEFT JOIN phone_maker mk on mk.CompanyName = b.? 
     WHERE pm.phoneModel is null 
     group by b.?"); 
$stmt->bind_param('ssss',$phoneModelField, $phoneModelField, $phnMakerField,$phoneModelField); 
$stmt->execute(); 

je reçois le msg d'erreur:

Fatal error: Call to a member function bind_param() on a non-object 

Cela fait référence à la ligne:

$stmt->bind_param('ssss',$phoneModelField, $phoneModelField, 

Et je suppose que c'est parce que le "préparer" sur mon sql n'a pas fonctionné comme $ stmt n'est pas un objet

En tant que tel, il me semble que vous ne pouvez pas lier les paramètres pour sélectionner les colonnes et les champs de jointure, vous pouvez uniquement lier à la clause where. Ai-je raison dans cette assertion ou ai-je oublié quelque chose?

Répondre

1

déclarations préparées ne vous permettent de lier les valeurs , d'autres constructions (tels que champs, tables ou fonctions, et encore moins les bits entiers de SQL) ne sont pas autorisés.

0

@Victor Nicollet est correct - vous pouvez utiliser un paramètre de requête uniquement dans un contexte où vous auriez pu utiliser une valeur littérale . Si vous avez besoin de créer d'autres parties de votre variable de requête (par exemple, nom de colonne, nom de table, mots-clés SQL ou expressions SQL entières), vous devez créer une requête SQL dynamique sous forme de chaîne et interpoler les variables ou expressions PHP dans la chaîne. Veillez à le faire avec soin pour éviter les vulnérabilités d'injection SQL.

L'autre WTF dans votre code est que vous n'avez pas vérifié que la fonction prepare() a renvoyé un objet de type mysqli_stmt. Dans ce cas, étant donné que vous avez utilisé des paramètres de requête de manière incorrecte, prepare() a renvoyé false pour indiquer une erreur de syntaxe. Bien sûr faux n'est pas un objet; il n'a pas de méthode bind_param(). C'est pourquoi vous avez l'erreur que vous avez faite.

Questions connexes