Je reçois pas mal d'erreurs en essayant de créer une dynamique où l'article en utilisant mysqli:
Avertissement: Paramètre 2 à mysqli_stmt :: bind_param () devrait être un référence, la valeur donnée dans ... la ligne 319 p>
Attention: mysqli_stmt :: execute (): (HY000 / 2031): Pas de données fournies pour paramètres dans la déclaration préparée dans ... sur la ligne 328 p>
Avertissement: mysqli_stmt :: bind_result (): (HY000 / 2031): Données fournies Non pour les paramètres de l'état préparé dans ... sur la ligne 331 p>
Avertissement: mysqli_stmt :: store_result (): (HY000 / 2014): commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant ... en ligne 332 p> Blockquote>
Im devinant il y a un peu de changement qui est nécessaire pour résoudre les problèmes, mais ce qui se passe est que si l'un des deux du menu déroulant ne sont pas égaux
Tous code> ou si les deux n » t égal à
Tous code> alors il vient avec les erreurs. p>
Voici l'affichage du code à la fois les menus déroulants et la requête (avec dynamique clause where) qui suit en fonction n options sélectionnées : p>
HTML: strong> p>
baisse des élèves dans le menu déroulant: p>
function StudentAnswers() { /*BELOW IS THE QUERY WHERE I AM TRYING TO RETRIEVE DATA DEPENDING ON THE ASSESSMENT CHOSEN AND THEN DEPENDING ON OPTIONS CHOSEN IN STUDENT AND QUESTION NUMBER DROP DOWN MENU */ $selectedstudentanswerqry = " SELECT StudentAlias, StudentForename, StudentSurname, q.SessionId, QuestionNo, QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT( DISTINCT Answer ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, QuestionMarks, GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime, MouseClick, StudentMark FROM Student s INNER JOIN Student_Answer sa ON (s.StudentId = sa.StudentId) INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId) INNER JOIN Question q ON (sa.QuestionId = q.QuestionId) INNER JOIN Answer an ON q.QuestionId = an.QuestionId LEFT JOIN Reply r ON q.ReplyId = r.ReplyId LEFT JOIN Option_Table o ON q.OptionId = o.OptionId "; // Initially empty $where = array('q.SessionId = ?'); $parameters = array($_POST["session"]); $parameterTypes = 'i'; // Check whether a specific student was selected if($_POST["student"] !== 'All') { $where[] = 'sa.StudentId = ?'; $parameters[] =& $_POST["student"]; $parameterTypes .= 'i'; } // Check whether a specific question was selected // NB: This is not an else if! if($_POST["question"] !== 'All') { $where[] = 'q.QuestionId = ?'; $parameters[] =& $_POST["question"]; $parameterTypes .= 'i'; } // If we added to $where in any of the conditionals, we need a WHERE clause in // our query if(!empty($where)) { $selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where); global $mysqli; $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry); // You only need to call bind_param once call_user_func_array(array($selectedstudentanswerstmt, 'bind_param'), array_merge(array($parameterTypes), $parameters)); //LINE 319 ERROR 1 } //Add group by and order by clause to query $selectedstudentanswerqry .= " GROUP BY sa.StudentId, q.QuestionId ORDER BY StudentAlias, q.SessionId, QuestionNo "; // get result and assign variables (prefix with db) $selectedstudentanswerstmt->execute(); //LINE 328 ERROR 2 //bind database fields $selectedstudentanswerstmt->bind_result($detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId,$detailsQuestionNo, $detailsQuestonContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks,$detailsStudentAnswer,$detailsResponseTime, $detailsMouseClick,$detailsStudentMark); //LINE 331 ERROR 3 //store results retrieved $selectedstudentanswerstmt->store_result(); //LINE 332 ERROR 4 //count number of rows retrieved $selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); //output query echo "$selectedstudentanswerqry"; } ?>
3 Réponses :
AVERTISSEMENT: paramètre 2 à mysqli_stmt :: bind_param () devrait être une référence, valeur donnée dans ... à la ligne 319 p>
Cela devrait être auto-explicite: les arguments de bind_param sont passés par référence et doivent donc être des variables. Ce que vous avez peut-être négligé, c'est que
array_merge code> renvoie un nouveau tableau qui ne contient pas de références aux variables d'origine, mais juste des valeurs. P>
Les erreurs suivantes sont simplement ultérieures, car les paramètres n'étaient pas liés. p>
Une solution possible consiste à stocker des références dans votre code> paramètres code>, ceux-ci seront même préservés par Array_Merge: P>
$parameters[] =& $_POST["student"]; $parameters[] =& $_POST["question"];
Code édité dans ma question à rencontrer votre solution. Il affiche toujours cette erreur principale. Si c'est plus de code que d'ajouter & code> puis pouvez-vous me montrer plus de code, je me suis battu avec cela, c'est pourquoi j'ai créé une prime pour espérer obtenir une solution :)
L'attribution de références ne provoque pas la variable avec l'affectation à transmettre par référence. Il serait toujours transmis par la valeur (la référence elle-même adoptée par la valeur) et vous auriez la même erreur.
Ceci est une situation collante causée par le changement de aussi laid que ceci est, il fonctionnera à appeler Call_user_func_array Code> Comportement dans PHP 5.4 (je dois supposer): documentation
bind_param code> de cette façon: P>
$pdo = new PDO('mysql:host=localhost', 'username', 'password');
$stmt = $pdo->prepare($selectedstudentanswerqry);
$stmt->execute($parameters);
$selectedstudentanswernum = $stmt->rowCount();
Après ce projet que j'ai fini, Tommmorow, je ne toucherai jamais MySqli de plus jamais Haha, je vais tester votre théorie
Cela a fonctionné toutes les erreurs disparues. Merci :) C'est laid mais cela doit être fait. J'utiliserai définitivement PDO après ce projet. 22 heures jusqu'à ce que la prime puisse être donnée
@ user1914374 Au cas où vous ne le saviez pas, vous ne récupérez pas votre représentant si vous ne prenez pas la prime
+1 sur Ditching mysqli et ne pas traiter de ce genre de choses :)
Ce n'est toujours pas assez bon pour Ditch Mysqli pour le PDO, en particulier lorsque j'avais de très bonnes raisons de ne pas utiliser PDO à la place, à cette époque. D'autre part, ils n'ont pas besoin de forcer mysqli_stmt :: Bind_Param et Bind_Result Méthodes pour exiger que les variables soient transmises BYREF, elles auraient pu leur renvoyer un tableau. Mais, le problème réel ici est que la transmission de temps d'appel n'est plus possible, mais MySQLI nécessite toujours une référence de référence, de sorte que quiconque utilise des paramètres dynamiques (quiconque a intuitif SQL qui est) se fait prendre Dans cette question, moi-même inclus. Après avoir passé des heures à rédiger une classe de wrapper MySQLI personnalisée qui convertit des ensembles de matrice en énoncés SQL préparés de manière dynamique, je ne suis pas sur le point d'essayer de vous réécrire de travailler avec PDO, d'autant plus que PDO a besoin de nommer vos paramètres dans le cadre de la liaison, Je devrais écrire plusieurs fonctions afin de construire la liste de ce qui a été envoyé ... pour chaque type de requête. Ceci est contre-intuitif et je ne vais pas perdre d'innombrables heures à essayer d'imiter ce que j'ai accompli avec MySQLI. P>
Le seul attelage à ce stade est que nous ne pouvons pas passer les variables dans call_user_func_array () byref et mysqli_stmt :: bind_ * les nécessite qu'ils soient passés à Byref ... donc les seules options que nous avons sont 1) Écrire un nouveau Call_user_func_array () Fonction conçue pour fonctionner explicitement pour les méthodes BIND_ * *, où les paramètres transmis sont essentiellement copiés dans un nouveau réseau ou un nouveau jeu de variables par ARG, puis transmettez-les sur le rappel; ou 2) réécrire la classe MySQLI pour le faire de bonne manière et regarder simplement ce qui est passé, effectuez le SQL, puis renvoyez le résultat comme prévu. Il n'y a aucune raison que ce que nous passons à une méthode pour effectuer SQL doit être encombré de résultats, il doit être traité comme une console SQL est traitée. P>
Parce que je suis trop épuisé du codage jusqu'à ce que mes yeux ne saignent presque, je vais prendre l'option non suggérée de garder ma version PHP coincée à 5,3.10-1 jusqu'à ce que je reçois le problème corrigé le problème. Pour ceux qui se disputeraient »pour tout cet effort, pourquoi ne pas simplement le dépenser à écrire votre emballage PDO à la place?» ... et ma réponse est simple: j'utilise PHP et MySQL exclusivement sur de nombreux projets où le serveur est un minuscule petit ordinateur Avec des chambres et des ressources très limitées, sans parler de la capacité de la CPU. PDO charge tout ce qu'il peut faire, pas seulement ce que vous allez utiliser, il existe donc certaines réservations faites dans vos ressources pour des choses que vous n'en utiliserez pas, que mes projets ne peuvent pas se permettre de perdre. P>
Heureusement, garder ma version PHP détenue ne sera pas préjudiciable à ce moment-là. C'est ce que de nombreuses exploitations de serveurs de niveau d'entreprise font en réalité pour éviter de faire tout le temps pour être «sur la version actuelle» de quelque chose, qui est également incroyablement coûteux à améliorer toutes les deux années. P>