tag:forum.selfhtml.org,2005:/self mysqli_result – SELFHTML-Forum 2016-07-06T08:59:10Z https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670595#m1670595 tobi85 2016-07-05T15:56:06Z 2016-07-05T15:56:06Z mysqli_result <p>Hallo,</p> <p>ich möchte gerade von mysql zu mysqli umstellen.</p> <p>Bei folgender Funktion habe ich ein problem, da es wohl mysqli_result nicht gibt. Wie kann ich denn die Daten einfach ausgeben lassen.</p> <pre><code class="block">$q = "SELECT * FROM artikel WHERE id='$id' "; $res = mysql_query($q); $text = mysql_result($res,0,'text'); </code></pre> <p>neu aber mit Fehler: Call to undefined function mysqli_result()</p> <pre><code class="block">$q = "SELECT * FROM artikel WHERE id='$id' "; $mysqli = new mysqli(dbserver,dbuser,dbpass,dbname); $res = $mysqli->query($q); $text = mysqli_result($res,0,'text'); </code></pre> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670598#m1670598 Rolf b 2016-07-05T16:18:30Z 2016-07-05T16:32:42Z mysqli_result <p>mysql_result() liefert Dir den Wert einer Spalte für alle Rows des Result-Set, wenn ich das richtig verstehe. Was es bei einem SELECT * macht, kann ich mir jetzt nicht recht vorstellen. Bekommst Du dann ein Array aus Arrays mit den Werten der Trefferzeilen?</p> <p>Jedenfalls solltest Du nicht das OO-API und das prozedurale API mischen. Das macht man nur zur Verwirrung der Russen.</p> <p>Wie wäre es hiermit:</p> <pre><code class="block language-php"><span class="token variable">$res</span> <span class="token operator">=</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$q</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$text</span> <span class="token operator">=</span> <span class="token variable">$res</span><span class="token operator">-></span><span class="token function">fetch_all</span><span class="token punctuation">(</span><span class="token constant">MYSQLI_NUM</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// oder MYSQLI_ASSOC</span> </code></pre> <p>Dann bekommst du ein Array aus Arrays mit den Zeileninhalten. Wenn Du es Zeile für Zeile verarbeiten möchtest, dann gibt's auch $res->fetch_assoc.</p> <p>Ein Hinweis am Rande, vermutlich überflüssig, aber wer weiß...: Das $mysqli Objekt legst Du nur einmal zu Beginn des PHP Scripts an, also da, wo Du bisher den mysql_connect gemacht hast, und speicherst es global, danach verwendest Du es für jede Query (es sei denn, du weißt was du tust und hast gute Gründe, mehrere Connections parallel zu halten).</p> <p>Rolf</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670603#m1670603 Google weiß alles 2016-07-05T16:44:03Z 2016-07-05T16:54:00Z mysqli_result <blockquote> <p>Hallo,</p> <p>ich möchte gerade von mysql zu mysqli umstellen.</p> <p>Bei folgender Funktion habe ich ein problem, da es wohl mysqli_result nicht gibt. Wie kann ich denn die Daten einfach ausgeben lassen.</p> <pre><code class="block">$q = "SELECT * FROM `artikel` WHERE id='$id' "; $res = mysql_query($q); $text = mysql_result($res,0,'text'); </code></pre> <p>neu aber mit Fehler:</p> </blockquote> <p>Versuchen wird das mal richtig:</p> <p>Deine Tabelle habe ein Feld "id" und eines "name". Dieses solltest Du auch angeben, denn sonst</p> <ul> <li>ist das Erfebnis "Zufall"</li> <li>die Ergebnismenge größer als nötig.</li> </ul> <pre><code class="block language-php"><span class="token variable">$q</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'SELECT `name` FROM artikel WHERE `id`='</span> <span class="token operator">.</span> <span class="token function">intval</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Nur sicher ist sicher!</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$res</span> <span class="token operator">=</span> <span class="token function">mysql_query</span><span class="token punctuation">(</span><span class="token variable">$q</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token function">mysqli_num_rows</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Hier ist was zu tun, wenn die Abfrage ein leeres (kein) Ergebnis liefert?</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">mysqli_num_rows</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$row</span> <span class="token operator">=</span> <span class="token function">mysqli_fetch_assoc</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$text</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">## Dein Ergebnis</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// Hier ist was zu tun, wenn die Abfrage unvermutet mehrere Ergebnisse liefert?</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// Hier ist was zu tun, wenn MySQL einen Fehler meldet?</span> <span class="token comment">// siehe: http://php.net/manual/de/mysqli.error.php</span> <span class="token punctuation">}</span> </code></pre> <p>Daneben fällt mir noch auf. dass die Abfrage "eher ungewöhlich" ist. Meist fallen diese komplexer aus. Frage deshalb: Hast Du mehrere Abfragen und verwendest Du womöglich das Ergebnis dieser Abfrage als Bestandteil weiterer Abfragen, vor allem in der where-Klausel?</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670599#m1670599 tobi85 2016-07-05T16:34:26Z 2016-07-05T16:34:26Z mysqli_result <p>Hallo und danke, aber wie speicher ich das mysqli-Objekt Global? Das war schon mal meine Frage in einem anderen Post...</p> <p>$mysqli = new mysqli(dbserver,dbuser,dbpass,dbname);</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670604#m1670604 tobi85 2016-07-05T16:53:10Z 2016-07-05T16:53:10Z mysqli_result <p>Also bei fetch_all bekomme ich auch eine Fehlermeldung.</p> <p>Call to undefined method mysqli_result::fetch_all()</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670600#m1670600 Rolf b 2016-07-05T16:40:08Z 2016-07-05T16:40:08Z mysqli_result <pre><code class="block">function initDatabase() { global $mysqli; $mysqli = new mysqli(dbserver,dbuser,dbpass,dbname); } function getData() { global $mysqli; $mysqli->query(...); } </code></pre> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670602#m1670602 Rolf b 2016-07-05T16:42:28Z 2016-07-05T16:42:28Z mysqli_result <p>Was ich eben nicht mehr hinein editieren konnte: Wenn Du nur eine Spalte aus der Tabelle brauchst, dann solltest Du das im SELECT Statement auch zum Ausdruck bringen - gerade dann, wenn die Tabelle viele Spalten hat. Sonst transferierst Du jede Menge Wegwerf-Daten vom Server ins PHP.</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670663#m1670663 Matti 2016-07-06T08:59:10Z 2016-07-06T08:59:10Z mysqli_result <p>Hallo,</p> <blockquote> <p>aber wie speicher ich das mysqli-Objekt Global?</p> </blockquote> <p>gar nicht. Gewöhn dir globale Variablen von Anfang an ab. Nutze stattdessen Dependency Injection. Es beschreibt, dass die Klassen ihre Abhängigkeiten übergeben bekommen (injected), anstatt dass diese danach fragen müssen (etwa in globalen Variablen). Dies sorgt dafür, dass deine Klassen saubere Boundaries haben, die dir später das Testen stark erleichern werden.</p> <p>Frage sich nur, von welcher Klasse ich da rede: ArtikelRepository. Wie du anhand des Namens erkennen kannst, empfehle ich dir, hier direkt das Repository-Pattern zu verwenden. Geh zunächst mal einen Schritt zurück vom Code und überlege dir, was du da hast.</p> <p>Du hast einen Datenspeicher (in diesem Fall eine relationale Datenbank, mysql), und darin sind Business-Objekte von dir gespeichert (Artikel). Das Repository beschreibt eine Möglichkeit, auf einen Datenspeicher zuzugreifen. In Ermangelung von UML-Künsten meinerseits ohne Zeichnung: das Repository hat eine Methode, die als Parameter die id bekommt und dein Artikel-Objekt zurückgibt. Das Repository braucht dabei intern die mysql-Verbindung.</p> <p>Also probier mal zum Start sowas hier:</p> <pre><code class="block language-php"><span class="token variable">$mysqli</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">mysqli</span><span class="token punctuation">(</span><span class="token comment">/* ... */</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$repo</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArtikelRepository</span><span class="token punctuation">(</span><span class="token variable">$mysqli</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$artikel</span> <span class="token operator">=</span> <span class="token variable">$repo</span><span class="token operator">-></span><span class="token function">findById</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">ArtikelRepository</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$mysqli</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$mysqli</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mysqli</span> <span class="token operator">=</span> <span class="token variable">$mysqli</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">findById</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mysqli</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token comment">/*...*/</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$obj</span> <span class="token operator">=</span> <span class="token variable">$res</span><span class="token operator">-></span><span class="token function">fetchAssoc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// kenne die genaue Syntax nicht mehr</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Artikel</span><span class="token punctuation">(</span><span class="token variable">$obj</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">,</span> <span class="token variable">$obj</span><span class="token operator">-></span><span class="token property">preis</span> <span class="token operator">/</span><span class="token operator">*</span> usw <span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Artikel</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$name</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$preis</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token variable">$preis</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">preis</span> <span class="token operator">=</span> <span class="token variable">$preis</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Wie gesagt: wenn dir die Klasse Artikel nicht brauchst (im Sinne von Domain-Driven Design willst du dort deine Business-Logik ablegen!), kannst du in findById auch direkt $res->fetchAssoc() zurückgeben, dann hast du in $artikel ein assoziatives Array mit deinen Tabelleninhalten.</p> <p>Viele Grüße, Matti</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670614#m1670614 Google weiß alles 2016-07-05T17:38:43Z 2016-07-05T17:38:43Z mysqli_result <blockquote> <pre><code class="block"> global $mysqli; </code></pre> </blockquote> <p>Ich weiß nicht ...</p> <p>ich finde (wennschon, dennschon):</p> <pre><code class="block language-php"><span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'db_con'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">mysqli</span><span class="token punctuation">(</span>dbserver<span class="token punctuation">,</span>dbuser<span class="token punctuation">,</span>dbpass<span class="token punctuation">,</span>dbname<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>und</p> <pre><code class="block language-php"><span class="token variable">$res</span> <span class="token operator">=</span> <span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'db_con'</span><span class="token punctuation">]</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token punctuation">)</span> </code></pre> <p>irgendwie deutlicher.</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670605#m1670605 Rolf b 2016-07-05T16:55:53Z 2016-07-05T16:55:53Z mysqli_result <p>Zufall ist das Ergebnis nicht, der Server liefert die Columns so aus wie in der Table definiert; und davon bekommt er die erste. Trotzdem ist's natürlich besser, nichts Unnötiges zu bestellen.</p> <p>Noch eine Anmerkung zu global - da hatte es ja schon im anderen Thread von tobi85 Diskussion zu gegeben: Ja, es gibt 'böse' Konstrukte, und global ist eins davon. Schöner wäre auf jeden Fall ein Repository-Objekt, das die Connection als private Eigenschaft enthält, und die Datenbankzugriffe als Methoden anbietet. Dieses Objekt legt man dann einmal in der Script-Initialisierung an und reicht es überall hin durch. Ob man die Refaktorierung so weit treibt, hängt von der verfügbaren Arbeitszeit ab. Und vom PHP Knowhow. Wenn man "nur" von mysql auf mysqli umstellen will, ist ein globales Connection-Objekt meiner Meinung nach eine lässliche Sünde. Einen gewissen Runtime-Kontext hat man immer.</p> <p>Rolf</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670607#m1670607 Google weiß alles 2016-07-05T17:03:49Z 2016-07-05T17:06:40Z Korrekturen <p>$res = mysql_query() kann natürlich NICHT gehen. <strong>Das muss schon mysqli_query() sein ...</strong></p> <p>Eine Klammer fehlte auch noch.</p> <pre><code class="block language-php"><span class="token comment">//$con = mysqli_connect("my_host", "my_user", "my_password", "my_database");</span> <span class="token variable">$q</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'SELECT `name` FROM artikel WHERE `id`='</span> <span class="token operator">.</span> <span class="token function">intval</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Nur sicher ist sicher!</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token function">mysqli_query</span><span class="token punctuation">(</span><span class="token variable">$con</span><span class="token punctuation">,</span> <span class="token variable">$q</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 function">mysqli_num_rows</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Hier ist was zu tun, wenn die Abfrage ein leeres (kein) Ergebnis liefert?</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">mysqli_num_rows</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$row</span> <span class="token operator">=</span> <span class="token function">mysqli_fetch_assoc</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$text</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">## Dein Ergebnis</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// Hier ist was zu tun, wenn die Abfrage unvermutet mehrere Ergebnisse liefert?</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// Hier ist was zu tun, wenn MySQL einen Fehler meldet?</span> <span class="token comment">// siehe: http://php.net/manual/de/mysqli.error.php</span> <span class="token punctuation">}</span> </code></pre> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670606#m1670606 Rolf b 2016-07-05T16:57:28Z 2016-07-05T16:57:28Z mysqli_result <p>Sollte nicht sein. Zeig mal den Code im Zusammenhang.</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670609#m1670609 Google weiß alles 2016-07-05T17:09:46Z 2016-07-05T17:18:30Z Warum SELECT * nicht verwendet wird - "Zufällige Ergebnisse" <blockquote> <p>Zufall ist das Ergebnis nicht, der Server liefert die Columns so aus wie in der Table definiert; und davon bekommt er die erste.</p> </blockquote> <p>Ja. <strong>Genau das nennt man "Zufall"</strong>, weil die Tabelle ja mal - durch das Einfügen einer Spalte - neu definiert werden könnte. Wenn dann und deswegen wieder der Programmierer tätig werden muss, dann begann eine Abfrage mit "SELECT *"</p> <p>Schlimmer noch: Es könnten - sogar eine Zeitlang unentdeckt - Werte aus der falschen Spalte geliefert werden, was im Einzelfall höchst unwillkommen sein kann.</p> https://forum.selfhtml.org/self/2016/jul/5/mysqli-result/1670608#m1670608 tobi85 2016-07-05T17:04:11Z 2016-07-05T17:04:11Z mysqli_result <pre><code> global $mysqli; $q = "SELECT * FROM artikel LIMIT 10"; $res = $mysqli->query($q); $text = $res->fetch_all(MYSQLI_NUM); print_r($text); </code></pre>