2009-02-02 5 views
0

j'ai le code suivant, pour lequel j'obtiens l'erreur:mysqli champs de liaison dans une déclaration préparée

Avertissement: mysqli_stmt :: bind_result() [mysqli-stmt.bind-result]: Nombre de bind les variables ne correspondent pas au nombre de champs dans l'instruction préparée dans le fichier.

Si ce n'est qu'un avertissement, le code ne devrait-il pas encore fonctionner? Je veux faire un select * et afficher toutes les données à l'exception d'un champ, que je veux lier et gérer séparément. Y a-t-il un moyen de contourner ou une meilleure méthode? Ma solution pour le moment (non testé) est de lier le bon nombre de variables aux résultats avec getRecords, puis de lier séparément sous un nom différent avec getHtml.

Quels sont les avantages de la liaison, et est-ce nécessaire?

<?php 
if (isset($_GET["cmd"])) 
    $cmd = $_GET["cmd"]; else 
    die("You should have a 'cmd' parameter in your URL"); 
$id = $_GET["id"]; 
$con = mysqli_connect("localhost", "user", "password", "db"); 
if (!$con) { 
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error(); 
    exit; 
} 
$con->set_charset("utf8"); 
echo "test outside loop"; 
if($cmd=="GetSaleData") { 
    echo "test inside loop"; 
    if ($getRecords = $con->prepare("SELECT SELECT Product_NO, Product_NAME, SUBTITLE, CURRENT_BID, START_PRICE, BID_COUNT, QUANT_TOTAL, QUANT_SOLD, ACCESSSTARTS, ACCESSENDS, ACCESSORIGIN_END, USERNAME, BEST_BIDDER_ID, FINISHED, WATCH, BUYITNOW_PRICE, PIC_URL, PRIVATE_AUCTION, AUCTION_TYPE, ACCESSINSERT_DATE, ACCESSUPDATE_DATE, CAT_DESC, CAT_PATH, COUNTRYCODE, LOCATION, CONDITIONS, REVISED, PAYPAL_ACCEPT, PRE_TERMINATED, SHIPPING_TO, FEE_INSERTION, FEE_FINAL, FEE_LISTING, PIC_XXL, PIC_DIASHOW, PIC_COUNT, ITEM_SITE_ID FROM Sales WHERE Product_NO = ?")) FROM SaleS WHERE PRODUCT_NO = ?")) { 
     $getHtml = $con->prepare("SELECT PRODUCT_DESC FROM SaleS WHERE PRODUCT_NO = ?"); 
     $getHtml->bind_param("i", $id); 
     $getHtml->execute(); 
     $getHtml->bind_result($PRODUCT_DESC); 
     $getRecords->bind_param("i", $id); 
     $getRecords->execute(); 
     $getRecords->bind_result($PRODUCT_NO, $PRODUCT_NAME, $SUBTITLE, $CURRENT_BID, $START_PRICE, $BID_COUNT, $QUANT_TOTAL, $QUANT_SOLD, $ACCESSSTARTS, $ACCESSENDS, $ACCESSORIGIN_END, $USERNAME, $BEST_BIDDER_ID, $FINISHED, $WATCH, $BUYITNOW_PRICE, $PIC_URL, $PRIVATE_Sale, $Sale_TYPE, $ACCESSINSERT_DATE, $ACCESSUPDATE_DATE, $CAT_DESC, $CAT_PATH, $COUNTRYCODE, $LOCATION, $CONDITIONS, $REVISED, $PAYPAL_ACCEPT, $PRE_TERMINATED, $SHIPPING_TO, $FEE_INSERTION, 
     $FEE_FINAL, $FEE_LISTING, $PIC_XXL, $PIC_DIASHOW, $PIC_COUNT, $ITEM_SITE_ID); 
     while ($getRecords->fetch()) { 
      // operations snipped for question 
      echo "<h1>".$PRODUCT_NAME."</h1> 
<div id='leftlayer' class='leftlayer'> 
<p><strong>Username: </strong>".$USERNAME." 
<p><strong>Shipping to: </strong> ". $country ." 
<img src='./images/".$id.".jpg"' width='".$imageSize["width"]."' height='".$imageSize["height"]."'> 
</div> 
<div id='rightlayer'> 
</div>"; 
// 
} 
} 
} 
} 

Je voudrais aussi savoir ce qui ne va pas avec ma déclaration img src ..., je sens que je suis Mising quelque chose élémentaire, comme une barre oblique ou une citation.

edit: Le code affiche maintenant une erreur après le remplacement * avec des noms de colonne, cependant la boucle while n'est jamais entrée, et donc aucune action n'est effectuée.

Répondre

1

Vous devrez peut-être indiquer explicitement les noms de colonne dans votre SELECT plutôt que d'utiliser *, as per the examples for MySQLi bind_result().

En ce qui concerne la ligne img, vous avez une somme supplémentaire "après .jpg

<img src='./images/".$id.".jpg"' width= 

devrait être

<img src='./images/".$id.".jpg width= 

En outre, vous ne devez pas vraiment de sortir de la chaîne et concaténer les variables car l'utilisation de "entraînera l'analyse de la chaîne pour les variables de toute façon.

0

Je devine que le problème est ici:

$getRecords->bind_result($PRODUCT_NO, $PRODUCT_NAME, $SUBTITLE, $CURRENT_BID, $START_PRICE, $BID_COUNT, $QUANT_TOTAL, $QUANT_SOLD, $ACCESSSTARTS, $ACCESSENDS, $ACCESSORIGIN_END, $USERNAME, $BEST_BIDDER_ID, $FINISHED, $WATCH, $BUYITNOW_PRICE, $PIC_URL, $PRIVATE_Sale, $Sale_TYPE, $ACCESSINSERT_DATE, $ACCESSUPDATE_DATE, $CAT_DESC, $CAT_PATH, $COUNTRYCODE, $LOCATION, $CONDITIONS, $REVISED, $PAYPAL_ACCEPT, $PRE_TERMINATED, $SHIPPING_TO, $FEE_INSERTION, 
     $FEE_FINAL, $FEE_LISTING, $PIC_XXL, $PIC_DIASHOW, $PIC_COUNT, $ITEM_SITE_ID); 

Vous manque probablement une colonne. Le code fonctionnera si vous avez moins de colonnes que celles récupérées dans le jeu de résultats. En ce qui concerne l'étiquette img, si vous êtes sur xhmtl, vous devrez le fermer.

+0

Je manque une deliberatley colonne, PRODUCT_DESC. Voulez-vous dire dans votre réponse que le code ne fonctionnera pas si j'ai moins de colonnes que celles récupérées dans le jeu de résultats? –

+0

Je voulais dire le contraire, si vous mettez plus de colonnes le code ne fonctionnera pas. Moins de colonnes devraient fonctionner. –

+0

Comment pourrais-je manquer une colonne? J'ai moins que ce qui serait retourné par select * .., je ne comprends pas. –

0

Je commencerais en fixant cette ligne:

if ($getRecords = $con->prepare("SELECT SELECT Product_NO, Product_NAME, SUBTITLE, CURRENT_BID, START_PRICE, BID_COUNT, QUANT_TOTAL, QUANT_SOLD, ACCESSSTARTS, ACCESSENDS, ACCESSORIGIN_END, USERNAME, BEST_BIDDER_ID, FINISHED, WATCH, BUYITNOW_PRICE, PIC_URL, PRIVATE_AUCTION, AUCTION_TYPE, ACCESSINSERT_DATE, ACCESSUPDATE_DATE, CAT_DESC, CAT_PATH, COUNTRYCODE, LOCATION, CONDITIONS, REVISED, PAYPAL_ACCEPT, PRE_TERMINATED, SHIPPING_TO, FEE_INSERTION, FEE_FINAL, FEE_LISTING, PIC_XXL, PIC_DIASHOW, PIC_COUNT, ITEM_SITE_ID FROM Sales WHERE Product_NO = ?")) FROM SaleS WHERE PRODUCT_NO = ?")) { 

Je suppose qu'il devrait ressembler à ceci:

if ($getRecords = $con->prepare("SELECT Product_NO, Product_NAME, SUBTITLE, CURRENT_BID, START_PRICE, BID_COUNT, QUANT_TOTAL, QUANT_SOLD, ACCESSSTARTS, ACCESSENDS, ACCESSORIGIN_END, USERNAME, BEST_BIDDER_ID, FINISHED, WATCH, BUYITNOW_PRICE, PIC_URL, PRIVATE_AUCTION, AUCTION_TYPE, ACCESSINSERT_DATE, ACCESSUPDATE_DATE, CAT_DESC, CAT_PATH, COUNTRYCODE, LOCATION, CONDITIONS, REVISED, PAYPAL_ACCEPT, PRE_TERMINATED, SHIPPING_TO, FEE_INSERTION, FEE_FINAL, FEE_LISTING, PIC_XXL, PIC_DIASHOW, PIC_COUNT, ITEM_SITE_ID FROM Sales WHERE Product_NO = ?")) { 
Questions connexes