PDO Problem mit LIMIT – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self PDO Problem mit LIMIT Thu, 18 Jun 20 09:18:54 Z https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772303#m1772303 https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772303#m1772303 <p>Hallo in die eloquente Runde!</p> <p>Auf meinem Rechner zu Hause geht es. Jetzt habe ich es Online gestellt und es funzt nicht mehr.</p> <p>Wenn ich in der SELECT Anweisung :nummer driekt mit der 3 etc. Anspreche geht es. Also ohne :nummer.</p> <p>Das komische ist eben, das es zuhause auf dem Rechner geht und auf dem Server eben nicht.</p> <pre><code class="block">$nummer =3; $statement = $pdo->prepare("SELECT * FROM city ORDER BY id ASC LIMIT :nummer ,1"); $result = $statement->execute(array('nummer'=>$nummer )); $ergebnis = $statement->fetch(); </code></pre> <p>Franz</p> PDO Problem mit LIMIT Thu, 18 Jun 20 09:32:08 Z https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772304#m1772304 https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772304#m1772304 <p>Hallo,</p> <blockquote> <p>Auf meinem Rechner zu Hause geht es. Jetzt habe ich es Online gestellt und es funzt nicht mehr.</p> </blockquote> <p>dann solltest du dich als erstes fragen: Was ist unterschiedlich? Anderes DBMS? Andere PHP-Version?</p> <blockquote> <p>Das komische ist eben, das es zuhause auf dem Rechner geht und auf dem Server eben nicht.</p> </blockquote> <p>Leider war "geht nicht" noch nie eine hilfreiche Fehlerbeschreibung. Welche Fehlermeldungen, welche Ergebnisse bekommst du? Ich hoffe doch, dass du Fehlermeldungen (auch Notices) im Entwicklungsstadium auch anzeigen lässt. Die sind nämlich beim Debugging Gold wert.</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$nummer</span> <span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">;</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"SELECT * FROM city ORDER BY id ASC LIMIT :nummer ,1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'nummer'</span><span class="token operator">=></span><span class="token variable">$nummer</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$ergebnis</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Keinerlei Fehlerbehandlung. Du verwendest die Ergebnisse der einzelnen Abfragestufen, ohne sie anzusehen, gehst einfach davon aus, dass alles sauber läuft. Erst ganz zum Schluss stellst du fest, dass du nicht das Ergebnis bekommst, was du erwartest. Dabei kann der eigentliche Fehler schon viel früher passiert sein.</p> <p>Debugging heißt: Schritt für Schritt verfolgen, was da wirklich passiert!</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> PDO Problem mit LIMIT Thu, 18 Jun 20 11:01:41 Z https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772310#m1772310 https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772310#m1772310 <p>Lieber Franz,</p> <blockquote> <pre><code class="block bad language-php"><span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'nummer'</span><span class="token operator">=></span><span class="token variable">$nummer</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>der Array-Schlüssel sollte auch einen Doppelpunkt am Anfang haben:</p> <pre><code class="block good language-php"><span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">':nummer'</span> <span class="token operator">=></span> <span class="token variable">$nummer</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Offensichtlich ist dieser Doppelpunkt im Array auf manchen Systemen erforderlich und auf anderen nicht. Ob das der feine Unterschied zwischen MySQL und MariaDB ist - keine Ahnung und ist mir auch egal.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> PDO Problem mit LIMIT Thu, 18 Jun 20 09:49:40 Z https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772305#m1772305 https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772305#m1772305 <p>Auf meiner Testebene kommt kein Fehler und die Anzeige ist korrekt. Auf dem Server wird kein Fehler angezeigt, error_reporting(E_ALL).</p> <p>Nur die Ausgabe ist leer, als ob kein Treffer erzeilt wurde. Ich gehe davon aus, das es :nummer ist, da ich wenn ich sie direkt setze angezeigt wird.</p> <p>Wie kann ich am besten vorgehen um mir den Fehler anzeigen zu lassen.</p> PDO Problem mit LIMIT Thu, 18 Jun 20 10:22:26 Z https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772306#m1772306 https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772306#m1772306 <p>Hi,</p> <blockquote> <p>Auf meiner Testebene kommt kein Fehler und die Anzeige ist korrekt. Auf dem Server wird kein Fehler angezeigt, error_reporting(E_ALL).</p> </blockquote> <p>werden Fehler auch generell angezeigt?<br> display_errors = 1 in der php.ini, alternativ ini_set('display_errors', '1'); am Scriptanfang?</p> <blockquote> <p>Nur die Ausgabe ist leer, als ob kein Treffer erzeilt wurde. Ich gehe davon aus, das es :nummer ist, da ich wenn ich sie direkt setze angezeigt wird.</p> </blockquote> <p>Dein Beispielcode ist so kurz und überschaubar, dass mir kein Grund einfällt, warum das so sein sollte. Hast du vielleicht für Forum-Beispiel zu stark vereinfacht? Ist dein tatsächlicher Code in Wirklichkeit komplexer?</p> <blockquote> <p>Wie kann ich am besten vorgehen um mir den Fehler anzeigen zu lassen.</p> </blockquote> <p>Schrittweise. Prüfe nach jedem SQL-Methodenaufruf, was du zurückbekommst und ob dieses Ergebnis plausibel ist. Das ist die beste Systematik, um erstmal zu finden, an welcher Stelle es schiefgeht.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> PDO Problem mit LIMIT Thu, 18 Jun 20 10:42:50 Z https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772308#m1772308 https://forum.selfhtml.org/self/2020/jun/18/pdo-problem-mit-limit/1772308#m1772308 <p>Hallo Franz,</p> <p>bevor DU lange suchst, eine ganz blöde Frage: Bist Du überzeugt und hast Du es überprüft, dass die Datenbank, die Du am benutzt, überhaupt Einträge in der city-Tabelle hat?</p> <p>Grundsätzlich sieht dein SQL korrekt aus, und der Umstand, dass der Array-Parameter von execute zur Bindung eines String-Parameters führt, scheint auf deiner Entwicklerkiste nichts auszumachen, daher hoffe ich mal, dass das nicht das Problem ist. Unsauber ist es schon, weil LIMIT eine Zahl erwartet und keinen String. Die sauberere Lösung ist, mit bindValue oder bindParam zu arbeiten. Ich schreib's unten mal als Beispiel mit hinein. Wenn man sowas macht, übergibt man die Parameter nicht mehr an execute(). Aber wie gesagt: ich glaube nicht dass es nötig ist. Der Unterschied zwischen bindParam und bindValue ist, dass bindParam beim execute in die Variable schaut, d.h. wenn Du 5 execute machst und jedesmal der Variablen einen anderen Wert gibst, wird auch jedesmal ein anderer Wert benutzt. Bei bindValue bindest Du einmal einen festen Wert.</p> <p>Und error_reporting genügt bei SQL Abfragen nicht. Du musst nach den prepare und nach dem fetch prüfen, ob das Ergebnis FALSE ist.</p> <pre><code class="block language-php"><span class="token comment">// prepare liefert ein Statement oder FALSE</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"SELECT * FROM city ORDER BY id ASC LIMIT :nummer ,1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$statement</span> <span class="token operator">===</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$errInfo</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">errorInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Prepare-Fehler! SQLSTATE=<span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span></span>, Driver Errorcode <span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span><br>Driver message: <span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span></span><br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Beispiel für explizite Bindung</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">bindParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">':nummer'</span><span class="token punctuation">,</span> <span class="token variable">$nummer</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">PARAM_INT</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">bindValue</span><span class="token punctuation">(</span><span class="token string single-quoted-string">':nummer'</span><span class="token punctuation">,</span> <span class="token variable">$nummer</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">PARAM_INT</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// execute liefert immer nur TRUE oder FALSE</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'nummer'</span><span class="token operator">=></span><span class="token variable">$nummer</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token variable">$errInfo</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">errorInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Execute-Fehler! SQLSTATE=<span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span></span>, Driver Errorcode <span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span><br>Driver message: <span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span></span><br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$ergebnis</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$ergebnis</span> <span class="token operator">===</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$errInfo</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">errorInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Fetch-Fehler! SQLSTATE=<span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span></span>, Driver Errorcode <span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span><br>Driver message: <span class="token interpolation"><span class="token variable">$errInfo</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span></span><br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Der Vergleich auf FALSE muss mit === erfolgen, um ausschließlich das boolsche FALSE zu erwischen und nicht irgendeinen möglichen falsy-Wert.</p> <p>Eine solche Fehlerbehandlung kann man auch in eine Funktion auslagern, und ob echo für dich der richtige Weg ist oder ob Du ein anderes Logging verwendest, hängt von deiner Webseite ab. Der echo ist nur ein Beispiel (und kann je nach Bauweise deiner Seite auch zu Problemen führen).</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>