2009-07-21 5 views
0

J'utilise l'extension php mysqli avec des instructions préparées, mais sur une requête, il ne crée pas l'objet de requête.PHP Mysqli préparé ne créant pas d'objet d'instruction

Voici le code:

$sqlq = "SELECT id,name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid=?"; 
if($allsubcats) 
{ 
    foreach($allsubcats as $key => $data) 
    { 
     $sqlq .= " OR categoryid=?"; 
    } 
} 
echo $sqlq; 
if($query = $this->mysqli->connection->prepare($sqlq)) 
{ 
    $query->bind_param("i", $cat); 
    if($allsubcats) 
    { 
     foreach($allsubcats as $key => $data) 
     { 
      $query->bind_param("i", $data[0]); 
     } 
    } 
    $query->execute(); 
    $query->bind_result($id,$name); 
    $query->store_result(); 
    if($query->num_rows > 0) 
    { 
     while($row = $query->fetch()) 
     { 
      $allprods["id"] = $id; 
      $allprods["name"] = $name; 
     } 
    } 
    $query->close(); 
} 

Le problème:

La ligne if($query = $this->mysqli->connection->prepare($sqlq))
Le if() est soit faux, et donc ne pas créer l'objet $query, et ne pas exécuter tout le code à l'intérieur le si.

Les retours echo $sqlq;:

« id, nom SELECT DE REJOIGNEZ produits sur catégories de produit productcategories.productid = products.id OÙ categoryid = OU categoryid = OU categoryid = OU categoryid = OU categoryid =??? OU categoryid =? "

Avec quoi je ne vois rien de mal.

Toute aide serait grandement appréciée,

Merci, Nico

Répondre

2

typique, Je l'ai travaillé moi-même dès que je posté, quelqu'un d'autre voir les choses mieux dès qu'ils demandent de l'aide? ?

Quoi qu'il en soit,

SELECT id, name FROM REJOIGNEZ produits sur catégories de produit productcategories.productid = products.id OÙ categoryid =? OU categoryid =? OU categoryid =? OU categoryid =? OU categoryid =? OU categoryid =?

aurait dû être

SELECT productcategories.id, products.name, products.id DE REJOIGNEZ produits sur catégories de produit productcategories.productid = products.id OÙ categoryid =? OU categoryid =? OU categoryid =? OU categoryid =? OU categoryid =? OU categoryid =?

+0

Vous n'êtes pas le seul, si cela peut vous rassurer ^^ Et vous avez eu un excellent réflexe, revenant à donner la solution :-) –

+0

Se lever voté pour répondre à votre propre question whoda thunk il: D – rezzif

+2

Caoutchouc ducking ftw . http://www.c2.com/cgi/wiki?RubberDucking – hobodave

0

Je ne pense pas que vous appelez en fait la préparer sur l'objet de connexion plutôt que l'objet mysqli lui-même.

à savoir


if($query = $this->mysqli->connection->prepare($sqlq)) 

devrait juste être


if($query = $this->mysqli->prepare($sqlq)) 

Modifier
Commander le premier exemple:
http://php.net/manual/en/mysqli.prepare.php

Edit2:

Ahh oui je vois.

En marge, vous devriez considérer aliasing vos tables:


SELECT pc.id,p.name,p.id 
FROM productcategories pc 
JOIN products p ON pc.productid = p.id 
WHERE categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? 
+0

En général oui, mais dans ce cas $ mysqli est un objet d'une classe personnalisée, où $ connection est la connexion $ mysqli. –

1

Hey Nico. Ce n'est pas une réponse à votre question, car vous y avez déjà répondu. Juste une suggestion non sollicitée.Je ne suis pas sûr combien de fois cette requête sera exécutée, ou combien de catégories pourraient être ajoutées, mais vous pouvez envisager d'utiliser la syntaxe WHERE IN.

Au lieu de:

WHERE foo = ? OR foo = ? OR foo = ? OR foo = ? 

Utilisation:

WHERE foo IN (?,?,?,?) 

Vous allez faire des requêtes plus facile à lire et enregistrer une infime quantité de temps dans votre application. (en envoyant moins de données à MySQL, plus petites chaînes en PHP)

+0

Salut, merci pour cela, mal le changer. Je pense que je vais bien à quelque chose, et il s'avère qu'il y a tellement plus à apprendre. Je vous ai upvoted, mais je ne vais pas le marquer comme la réponse acceptée, vu qu'il ne répond pas à la question. –