2010-01-11 8 views
0

Je voulais savoir si les déclarations préparées peuvent être utilisées de la manière suivante:Est-ce qu'une instruction préparée dans MySQL peut contenir PREPARE et EXECUTE?

public static function GetCategoryItems($categoryId,$pageNum, &$rnum_pages) 
    { 
    $sql = 'SELECT DISTINCT COUNT(*) AS items_count 
       FROM item I 
       JOIN sub_category SC 
       ON I.sub_category_id = SC.sub_category_id 
       JOIN category C 
       ON C.category_id = SC.category_id 
       WHERE (I.location = 2 OR I.location = 3) 
       AND C.category_id =' . (int)$categoryId ; 
     $params = array (':category_id'=>$categoryId); 
     $rnum_pages = Catalog::CalculatePages($sql,$params); 
     $first_item = ($pageNum - 1) * ITEMS_PER_PAGE; 
      $sql = 
     "PREPARE stmt_name FROM 
     'SELECT I.item_id, I.name , I.price, I.discounted_price, I.thumbnail_photo 
     FROM item I 
     JOIN sub_category SC 
     ON I.sub_category_id = SC.sub_category_id 
     JOIN category C 
     ON C.category_id = SC.category_id 
     WHERE C.category_id = ? 
     LIMIT ?,? ' ; 

     SET @p1 = categoryId; 
     SET @p2 = firstItem; 
     SET @p3 = items_per_page; 

     EXECUTE stmt_name USING @p1,@p2,@p3; " 
     return DatabaseConnection::GetAll($sql,$params); 
     } 

Je reçois effectivement une erreur:

ERRNO: 256 TEXT: SQLSTATE[HY000]: General error 

peut-elle aider quelqu'un s'il vous plaît?

+0

D'où viennent les catégories 'categoryId',' firstItem' et 'items_per_page'? Sont-ils supposés être des variables PHP? –

+0

Y a-t-il une raison particulière pour laquelle vous utilisez l'interface sql pour les instructions préparées au lieu de certaines API qui permettent l'utilisation du protocole binaire comme par ex. mysqli ou pdo? – VolkerK

+0

Eh bien Im juste un débutant. Im juste essayer des choses par moi-même et apprendre en même temps. Je ne sais rien à propos de mysqli .. – chupinette

Répondre

0

En général, les PREPARE et EXECUTE sont des opérations « côté client » que le `côté serveur » du SGBD ne voit normalement pas. Cela était une règle stricte et rapide; les choses sont maintenant floues avec les procédures stockées et similaires permettant SQL dynamique. Par conséquent, ce que vous essayez peut être être possible dans MySQL, mais il semble douteux (au moins).

Cependant, étant donné que vous avez des problèmes, je recommande de fractionner le deuxième segment de SQL en deux opérations distinctes - et omettre le blurb PREPARE et le blurb EXECUTE. Vous aurez besoin de passer les paramètres à l'instruction qui exécute le split SQL (à la phase d'exécution du split SQL, en fait).

+0

Merci pour votre réponse. Je vais essayer de faire ce que vous avez suggéré. :) – chupinette

0

Vous préparez stmt_name mais exécutez stmt - est-ce juste une faute de frappe?

Qu'en est-il des categoryId, firstName et items_per_page - d'où viennent ces produits?

+0

En fait j'utilisais une procédure stockée qui recevait 3 paramètres: CREATE PROCEDURE xyz (categoryId INT, premierItem INT, items_per_page INT). J'avais des problèmes en utilisant des procédures stockées (Reportez-vous à mes messages précédents). Donc, je suis passé à de simples déclarations SQL. Je ne sais pas si j'utilise correctement les instructions préparées. Quelqu'un peut-il me guider en les utilisant? – chupinette

0

Dans les commentaires des utilisateurs dans le PHP Manual, de « Brian à diamondsea »:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL client library running on our web server, and a latest-version MySQL server running on the database server's box.

Upgraded the MySQL client on the web server to the current revision and the problem went away.

+0

En fait l'erreur est : ERRNO: 256 TEXTE: SQLSTATE [HY000]: erreur générale LOCALISATION: C: \ xampp \ htdocs \ final \ classes \ database_connection.php, ligne 81, au 11 janvier 2010, 7:33 pm Afficher backtrace: trigger_error ("SQLSTATE [HY000]: erreur générale", "256") # ligne 81 Je ne vais pas avoir problème des requêtes unbuffered – chupinette