MySQL mit PHP ansprechen (Problem)
-
Hi,
ich bin noch nicht sehr geübt im Umgang mit PHP, das hier stammt aus meinem eigentlich ersten Projekt:
<?php $db = mysql_connect('localhost', '...', '...') or die ("Verbindung Fehlgeschlagen"); mysql_select_db('montblanc', $db); $sql_statement = "SELECT * FROM 'goba_news'"; $result = mysql_query($sql_statement); while($data = mysql_fetch_array($result)) { echo $data['news_head'] . " " . $data['news_text'] . "<br>"; } ?>
Das da oben ist natürlich keine direkt ausgeführte Datei sondern die ist mit include() in eine Tabelle eingefügt.
Wenn ich das ausführe, kommt als Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/montblanc/goethebash/news.php on line 10
Was hab ich falsch gemacht?
mfg
Jakel
-
Setz doch ein
echo mysql_error();
nach dem
... $result = mysql_query($sql_statement);
Dann siehst du vielleicht mehr.
-
Dann steht da:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''goba_news'' at line 1
-
Dein "goba_news" hast du in Stringliterale (') eingeschlossen. Wieso? Es ist kein String, es ist eine Tabelle! Also nimm entweder die (für MySQL) korrekten Backticks (`), oder lass die Begrenzungszeichen einfach weg (meine Empfehlung)
Ich rate (mal wieder) zu einem guten Grundlagentutorial
-
árn[y]ék schrieb:
Also nimm entweder die (für MySQL) korrekten Backticks (`), oder lass die Begrenzungszeichen einfach weg (meine Empfehlung)
Also ich würde sie nicht weglassen, habe da das eine oder andere mal schon Probleme gehabt, sicherer ist es mit Backticks.
-
Stell dir mal die Frage, warum du die Backticks verwenden solltest?
Sie sind Zeichen, um komplexe Spalten- und Tabellennamen zu maskieren, also beispielsweise Spalten mit dem Namen "Eine kleine Spalte" oder dergleichen. Solche Spaltennamen sind programmiertechnisch jedoch völliger unsinn. Normalerweise sollten Spalten- und Tabellennamen nur aus den ASCII-Zeichen [A-Za-z0-9] bestehen (zuzüglich einiger Zeichen wie "_"). Die Maskierung ist bei einer vernünftigen Vergabe von Bezeichnungen völlig überflüssig.
Nicht nur das! Jeder SQL-Dialekt kocht da sein eigenes Süppchen. In MSSQL wäre es beispielsweise nicht `aTableName` sondern [aTableName]. Solltest du jemals in den Genuss kommen, ein Projekt von einer Datenbank auf eine andere migrieren zu müssen, dann ist es der größte Käse überhaupt, dialektspeziefische SQL-Statements über den gesamten Quellcode verteilt zu haben.
Ergo: Entweder, du verwendest einen Wrapper dafür (sehr schön: Prepared Statements) und umgehst das Maskierungschaos so, oder du verwendest keine Maskierungen
PS sind hier natürlich vorzuziehen.
$statement = new sqlStatement('SELECT * FROM ?'); $statement->bindParams(array('goba_news')); $result = $statement->execute();
-
Hi,
erstmal danke, jetzt funktionierts
Und ein Grundlagentutorial hatte ich bereits, nur ist das recht lange her
mfg
Jakel