 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
29.08.2007, 19:30
|
#1
|
|
TP-Junior
Registriert seit: May 2007
Ort: Harburg
|
mysql_query Varianten
Hallo
Mich plagt mal eine Frage die ich mir selber nicht beantworten kann.
Es geht darum, Daten aus der Datenbank zu lesen und darzustellen.
Drei Möglichkeiten die ich gefunden habe:
PHP-Code:
// Variante 1.
$abfrage = "SELECT `id`, `titel`, `text` FROM tabelle";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)){
echo "<p>".$row->titel." - ".$row->text."</p>";
}
// Variante 2,
$abfrage = mysql_query("SELECT `id`, `titel`, `text` FROM tabelle";
while($row = mysql_fetch_row($abfrage)){
echo "<p>".$row['titel']." - ".$row['text']."</p>";
}
// Variante 3.
$abfrage = mysql_query("SELECT `id`, `titel`, `text` FROM tabelle";
while(list($id, $titel, $text) = mysql_fetch_row($abfrage)){
echo "<p>".$titel." - ".$text."</p>";
}
Alle drei machen das gleiche, kennt noch jemand eine weitere ?
Welche würdet ihr "warum" verwenden und welche "warum" auf keinem fall ?
lg bluefanu
|
|
|
30.08.2007, 01:30
|
#2
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Hallo bluefanu,
es gibt, um mal die wichtigsten zu nennen: mysql_fetch_assoc, mysql_fetch_row, mysql_fetch_object. Es gibt noch mysql_fetch_array das _assoc und _row in sich vereint, sofern im Zusatzparameter nicht angegeben wird das man nur z.B. ASSOC geliefert haben möchte.
mysql_fetch_assoc()
Daten in einem Datensatz sind über ein assoziatives Array ansprechbar. Hat man ein als 1. Feld ein "id" in der DB, dann kann man mit z.B. $datensatz['id'] darauf zugreifen.
mysql_fetch_row()
Daten eines Datensatzes werden über den numerischen Index angesprochen. Hat man ein als 1. Feld ein "id" in der DB, dann kann man mit z.B. $datensatz[0] darauf zugreifen.
mysql_fetch_object()
Behandelt einen kompletten Datensatz als Objekt. Feldnamen werden zu Eigenschaften des Objekt auf die man mit dem Pfeil zugreifen kann, z.B. $datensatz->id
Kennt man die Struktur der Datenbank genau, sollte man mit der _row Variante arbeiten. Die ist am schnellsten und belegt am wenigsten Resourcen, ist aber am unübersichtlichsten und andere (aber Du selbst auch, nach einer längeren Zeit) werden sich nur schwer wieder zurechtfinden.
Ich persönlich benutze fast ausschließlich mysql_fetch_object(), weil ich die DB Kommunikation eh objektorientiert über Klassen mache.
Ansonsten ist das mehr oder weniger Geschmackssache welche Variante Du benutzt.
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
30.08.2007, 09:40
|
#3
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
Hallo Rizzo,
ich bestätige alles, was Du geschrieben hast.
Aber woran machst Du das hier fest?
Zitat:
Zitat von Rizzo
Kennt man die Struktur der Datenbank genau, sollte man mit der _row Variante arbeiten. Die ist am schnellsten und belegt am wenigsten Resourcen
|
Nach meinem Verständnis ist gegenüber der mysql_fetch_object-Variante lediglich der Typ der zurückgegebenen Variable anders, sollte sich aber performancetechnisch nicht auswirken. Hast Du da eine Quelle zum Nachlesen?
|
|
|
30.08.2007, 09:55
|
#4
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Zitat:
Zitat von DSB
Aber woran machst Du das hier fest?
|
Hallo DSB,
das habe ich, wenn ich mich recht erinnere, in den Büchern von Jörg Krause (PHP 5 Grundlagen und Profiwissen), sowie irgendwo in der Online Doku gelesen. Dort wird auch erwähnt das mysql_fetch_object zu den langsameren der fetch Methoden zählt. (Zu der Funktion gibt es auch eine kurze Anmerkung im Manual, wo es heisst "Unter Berücksichtigung der Ausführungsgeschwindigkeit ist diese Funktion identisch zu mysql_fetch_array() und fast so schnell wie mysql_fetch_row() (der Unterschied ist unwesentlich).")
Langsam ist aber ein sehr dehnbarer Begriff, weil der Unterschied wohl meßbar, nicht aber wirklich spürbar ist - ähnlich wie bei Strings mit ' und "
Auch bei mysql_fetch_array() findet sich im Manual ein Hinweis, daß diese Funktion "nicht signifikant" langsamer ist als mysql_fetch_row() - aber langsamer bleibt langsamer, auch wenn es nur ein bisschen ist 
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
30.08.2007, 12:09
|
#5
|
|
TP-Junior
Registriert seit: May 2007
Ort: Harburg
|
Mahlzeit
Zitat:
|
Zitat von Rizzo
mysql_fetch_row()
Daten eines Datensatzes werden über den numerischen Index angesprochen. Hat man ein als 1. Feld ein "id" in der DB, dann kann man mit z.B. $datensatz[0] darauf zugreifen.
...
Kennt man die Struktur der Datenbank genau, sollte man mit der _row Variante arbeiten.
|
hmmm... in meinem Beispiel (Variante 3.) muss ich doch nur die Feldnamen kennen und kann die dann direkt via $datensatz ansprechen.
Liegt das an (list($datensatz, ...) ?
lg bluefanu
|
|
|
30.08.2007, 15:04
|
#6
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Richtig, dazu sollte man sich list() mal anschauen, dann sollte auch klar sein, wie es arbeitet.
|
|
|
01.09.2007, 14:59
|
#7
|
|
TP-Junior
Registriert seit: Mar 2007
Ort: Berlin
|
Hallo. Ich hab dazu auch ne Frage. Ich hab in meinen Büchern gelernt, dass SQL-Quries in etwa so aussehen:
Code:
"SELECT text FROM tabelle WHERE id = 1 "
Aber das funktioniert bei mir nicht.
Wenn ich eine solche Abfrage in PHPMyAdmin manuell ausführe, kommt als SQL-Statement folgendes:
Code:
"SELECT `text` FROM `tabelle` LIMIT 0 , 30"
Noch ein Beispiel:
Laut Buch und Online-Dokumentationen wurde mir das so beigebracht.
Code:
"UPDATE tabelle SET text = 'Neuer Text' WHERE id =1"
Aber in PHPMyAdmin nach manuellem Ändern:
Code:
"UPDATE `tabelle` SET `text` = 'Neuer Text' WHERE `text`.`id` =1 LIMIT 1 ;"
Alle Queries, funktionieren bei meinem XAMPP nur, wenn ich die SQL-Anweisungen aus PHPMyAdmin kopiere und in meinem PHP-Code einfüge. Meine eigenen jedoch nicht (manchmal hatten einige aber doch funktioniert).
Aber warum ist das so unterschiedlich. Ich sehe auch hier in den Workshops diese Queries, so wie ich es gelernt habe. Hat sich da was verändert oder liegt das Problem nur an meinem XAMPP?
|
|
|
01.09.2007, 17:20
|
#8
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
Zitat:
Zitat von ronsn
Hallo. Ich hab dazu auch ne Frage. Ich hab in meinen Büchern gelernt, dass SQL-Quries in etwa so aussehen:
Code:
"SELECT text FROM tabelle WHERE id = 1 "
Aber das funktioniert bei mir nicht.
|
Kein Wunder. "text" ist auch in den neueren MySQL-Versionen ein reserviertes Befehlswort. Deshalb muss es in Backticks gesetzt werden.
machs mal so:
Code:
"SELECT `text` FROM `tabelle` WHERE id = 1 "
Dann sollte es auch mit Deinen Queries klappen.
Wie alt ist das Buch denn? Eigentlich sollte der Autor das wissen. *g*
|
|
|
02.09.2007, 01:33
|
#9
|
|
TP-Junior
Registriert seit: Mar 2007
Ort: Berlin
|
Ok das waren von mir nur Beispiele mit dem "text". Ich fragte mich nur prinzipiell, ob das, was ich gelernt habe, schon veraltet ist und ob es Erneuerungen gibt. Ein großes Dankeschön spreche ich dir aber aus, weil du mir die Information gabst, dass "text" ein reserviertes Wort bei SQL (?) ist.
Was ist aber der Unterschied zwischen den "gelernten" Queries, und den von phpMyAdmin ausgegebenen Queries (,wenn man es manuell macht)? Wieso unterscheidet sich das so, und wieso hat das solch große Auswirkung?
|
|
|
02.09.2007, 01:44
|
#10
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Zitat:
Zitat von ronsn
Ok das waren von mir nur Beispiele mit dem "text". Ich fragte mich nur prinzipiell, ob das, was ich gelernt habe, schon veraltet ist und ob es Erneuerungen gibt. Ein großes Dankeschön spreche ich dir aber aus, weil du mir die Information gabst, dass "text" ein reserviertes Wort bei SQL (?) ist.
Was ist aber der Unterschied zwischen den "gelernten" Queries, und den von phpMyAdmin ausgegebenen Queries (,wenn man es manuell macht)? Wieso unterscheidet sich das so, und wieso hat das solch große Auswirkung?
|
Naja, wer weiß was Du gelernst hast?! phpMyAdmin spuckt die Queries eben präziser aus, also artig mit LIMIT hinten dran, angabe von Tabellenname/Datenbankname vor Felder und so weiter, weil das eben so sein sollte um Fehler zu vermeiden. Oftmals braucht man das aber nicht. Was man aber immer machen sollte ist Tabellennamen, Feldnamen in Backticks setzen um nicht unwissentlich ungültige Queries zu bauen.
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
02.09.2007, 12:26
|
#11
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
Zitat:
Zitat von ronsn
Ok das waren von mir nur Beispiele mit dem "text".
|
Du musst uns schon ein konkretes Beispiel zur Beurteilung geben, damit wir eine konkrete Aussage treffen können. Die Glaskugeln aller TP'ler sind gerade kollektiv zur Gemeinschaftsreinigung abgegeben worden. 
|
|
|
02.09.2007, 14:43
|
#12
|
|
TP-Junior
Registriert seit: Mar 2007
Ort: Berlin
|
*G* Ja. also ein konkretes Beispiel hatte ich leider nicht mehr, da ich alle Queries aus phpMyAdmin kopiert habe und dann in meinem Quellcode eingefügt habe ohne das alte zu behalten. Ich habe mich erst gewundert, als das das dritte mal nicht lief. Gelernt habe ich das ohne ` , so wie auch hier http://www.traum-projekt.com/forum/7...er-update.html . Ich wusste jedoch nicht, dass das der(/ein) Grund ist, warum es nicht funktioniert. Die Beispiele die ich genannt habe, waren insoweit korrekt. Ich habe aber hier als Beispiel anstatt "c_blog_ent" "text" und anstatt "c_ent" "tabelle" geschrieben. Der Rest ist gleich geblieben.
Ich wollte euch nicht verwirren und nen Hocus Pocus wollte ich auch nicht erzeugen. :-)
Ok, ich hab jetzt mal alle Daten so zusammengesucht, wie es anfing. In meinem Buch (Magnum: "PHP5 & MySQL 4.1" von Markt+Technik") steht ein Query so:
Code:
CREATE TABLE user (
ID INT UNSIGNED NOT NULL AUTO_INCREMENT ,
username CHAR(50) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT
'neueruser',
kwort BINARY( 50 ) DEFAULT 'kennwort',
admin TINYINT( 2 ) DEFAULT '-1' NOT NULL ,
beschreibung CHAR( 255 ) ,
kennung CHAR( 50 ) ,
zeit DATETIME,
PRIMARY KEY ( `ID` ) ,
UNIQUE ( username )
);
Das Teil funktioniert aber nicht. Ich war schon auf der Seite brain-and-trust.de und lud mir die Orginaldateien runter, um Fehler zu vermeiden. Aber das Ergebnis war das gleiche. Nichts passierte.
Also machte ich mich dran und erstellte die Tabelle per Hand in phpMyAdmin.
Der lieferte mir einen ganz anderen Query:
Code:
CREATE TABLE `user` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` CHAR( 50 ) CHARACTER SET latin1 COLLATE latin1_bin NULL DEFAULT 'neueruser',
`kwort` BINARY( 50 ) NULL DEFAULT 'kennwort',
`admin` TINYINT( 2 ) NOT NULL DEFAULT '-1',
`beschreibung` CHAR( 255 ) NULL ,
`kennung` CHAR( 50 ) NULL ,
`zeit` DATETIME NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;
Das ist eigentlich das Problem, was ich habe. Ich verstehe nicht warum das eine nicht geht, das andere aber doch. Kann das an irgendeiner Einstellung in meinem XAMPP liegen oder ist das jetzt neu, dass man das so schreiben muss? Bei PHP.net ist das auch immer ohne ` ...
Sorry, wenn ich mich vorher etwas missverständlich ausgedrückt habe.
Geändert von ronsn (02.09.2007 um 14:48 Uhr).
|
|
|
02.09.2007, 15:09
|
#13
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Zitat:
Zitat von ronsn
Kann das an irgendeiner Einstellung in meinem XAMPP liegen oder ist das jetzt neu, dass man das so schreiben muss?
|
Neu ist das ganz sicher nicht, denn wie Du hier schon in der seit einiger Zeit veralteten MySQL 3/4 Dokumentation (v4 ist noch verbreitet, hier geht es eher um die v3) siehst, wird das schon so gemacht und da wird auch erklärt welche Wörter reserviert sind.
Es bringt auch nichts wenn Du andere Quellen anführst mit dem Argument "Ja aber die machen das auch...". Streng betrachtet ist es einfach Schlamperei es ohne Backticks zu machen. Ich, genau wie die meisten anderen hier auch, schlampen da gelegentlich schon mal aus Faulheit - richtig ist es, war es und wird es wohl immer sein, mit Backticks. Es vermeidet einfach dumme unerklärbare Fehler, schon allein aus dem Grund sollte man es benutzen.
Früher hab ich auch nie Backticks benutzt, eben weil ich es auch immer und überall ohne gesehen habe. Dann hatte ich aber irgendwann auch mal so Probleme wie Du und sass wie ein Depp vor dem Screen und mir wollte nicht einleuchten wieso es nicht geht. Das hat mich kuriert und seit dem versuche ich konsequent immer Backticks zu benutzen, auch wenn es nur für ein einziges Feld in einem Select ist, das garantiert kein reserviertes Wort ist. 
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
02.09.2007, 15:24
|
#14
|
|
TP-Junior
Registriert seit: Mar 2007
Ort: Berlin
|
Ok. Ich habs eben so gelernt, und bin traurig über diese Schlamperei.
Also fasse ich für mich nochmal zusammen, dass ALLE Datenbanknamen, Tabellennamen und Tabellenfelder mit diesem Backtick versehen werden müssen.
Aber den Satz habe ich nicht richtig verstanden.
Zitat:
Zitat von Rizzo
[...]also artig mit LIMIT hinten dran, angabe von Tabellenname/Datenbankname vor Felder und so weiter[...]
|
Angabe von was? Von LIMIT ? Oder soll in einem Query der Tabellenname bzw. Datenbankname genannt werden, bevor ich ein Feldname nenne?
Wie sähe das denn in diesem Query aus?
Code:
"SELECT `text` FROM `tabelle` LIMIT 0 , 30"
Da kann ich doch gar nicht den Tabellennamen "tabelle" voher schreiben. Oder stell ich mich grad zu blöd an?
|
|
|
02.09.2007, 17:12
|
#15
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
also nochmal zum Mitschreiben
Backticks (`) dienen dazu, Namen zu "quoten" damit es nicht zur Kollision mit Schlüsselwörten kommt. Natürlich ist das manchmal lästig, aber es hilft, um Fehler zu vermeiden.
SELECT `text` FROM `tabelle`
Arbeitet man mit mehreren Tabellen, so bietet sich der Einsatz von aliases an
SELECT g.`text`, i.`id` FROM `tabelle1` g, `tabelle2` i
In diesen Beispielen müsste man nur text quoten, da das ein Schlüsselwort ist. Möchte man auf Backticks verzichten, sollte man sorgfältig bei der Namensgebung sein
SELECT inhaltstext FROM news
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
| |