Tomaten vor den Augen bei MySQL :-(
CoN
- php
Hallo!
Ich weiss nicht was ich falsch mache, aber irgendwas läuft hier nicht... ich habe irgendwann mal folgenden Quellcode geschrieben, auf zwei Dateien aufgeteilt funktioniert er. Aber wenn er in einer Datei ist, nicht mehr...
Ich hab schon einiges versucht, aber wahrscheinlich seh ich den Wald vor lauter Bäumen nicht....
Das ganze ist derzeit noch bei mir lokal auf dem Rechner, deswegen das nette Passwort und der tolle User :-)
Los gehts!
<?php
$host = "localhost";
$user = "root";
$password = "";
$database = "cms_test";
$table = "awd_news";
/* mit db verbinden */
$link = mysql_pconnect( $host, $user, $password ) or die("Verbindung zu MySQL konnte nicht hergestellt werden");
mysql_select_db( $database, $link ) or die("Datenbank-Fehler!");
/* datensatz raussuchen */
$result = mysql_query( "SELECT * FROM $table ORDER BY DATE DESC" );
/* datenbank schliessen */
mysql_close( $link );
// Wenn ich hier trenne und zwei Dateien raus mache, gehts. (?)
/* daten ausgeben */
$count = 0;
while ( $news= mysql_fetch_row( $result ) )
{
print "<p><b>$news[0] - $news[1]</b><br><font size="1">von <b>$news[5]</font></b></p><p>$news[2]</p>\n";
/* abfrage, ob link oder nicht */
if($news[4] =! "") {
print "<p>hier der link: <a href="$news[3]" target="_blank"><b>$news[4]</b></a></p>\n";
}
print "<img src="images/bg_black.gif" width="430" height="1">\n";
$count++;
if($count == 2)
break;
}
?>
Soweit der Code, und nun die Frage: Was hab ich verd.... nochmal übersehen? Und warum läuft es, wenn ich zwei einzelne Dateien habe?
Ich habs auch schonmal nur mit mysql_connect probiert (habe aber nen apache, da geht ja auch mysql_pconnect) und das "Datenbank schliessen" habe ich auch schonmal ans Ende verschoben. Hilft auch nicht.
Fehlermeldung ist folgende:
"Warning: Supplied argument is not a valid MySQL result resource in c:\apache\htdocs\awd\index.php on line 40"
... was ja nicht die Sache mit den "zwei Dateien = funktioniert" erklärt, oder?
Bin für jeden Zaunpfahl dankbar!
Gute N8. Vielen Dank bis denne. CoN.
Ach so, ich hatte vergessen:
Die Zeile 40 ist dort steht:
"while ( $news= mysql_fetch_row( $result ) )"
Sorry, ... Bis denne. CoN
Hi!
Also ich sehe da keinen Fehler. Versuch mal folgendes:
<?php
$host = "localhost";
$user = "root";
$password = "";
$database = "cms_test";
$table = "awd_news";
$link = mysql_pconnect( $host, $user, $password ) or die("Verbindung zu MySQL konnte nicht hergestellt werden");
mysql_select_db( $database, $link ) or die("Datenbank-Fehler!");
$result = mysql_query("SELECT * FROM $table ORDER BY DATE DESC");
echo "Fehler: ".mysql_error()."\n";
echo "gefundene Datensätze: ".mysql_num_rows($result)."\n";
print_r(mysql_fetch_row($result));
var_dump($result);
?>
Da müßtest Du jetzt eine Fehlermeldung bekommen, die Dir sagt was das Problem bei der Query ist, denn die PHP-Fehlemeldung besagt das hier eigentlich das Problem liegen müßte. Wie genau machst Du das mit 2 Dateien? Das das funktioniert und in einer Datei nicht verstehe ich nicht.
Grüße
Andreas
Hallo CoN,
$result = mysql_query( "SELECT * FROM $table ORDER BY DATE DESC" );
DATE ist ein Schluesselwort in SQL, das darf nicht als
Tabellen-Name benutzt werden. Ansonsten gibts
aussagekraeftigere Fehlermeldungen mit
$result = mysql_query("query") or die(mysql_error());
Gruesse,
CK
Hi Christian,
$result = mysql_query( "SELECT * FROM $table ORDER BY DATE DESC" );
DATE ist ein Schluesselwort in SQL, das darf nicht als
Tabellen-Name benutzt werden. Ansonsten gibts
aussagekraeftigere Fehlermeldungen mit$result = mysql_query("query") or die(mysql_error());
Seit wann darf man DATE nicht mehr als Feldname, Indexname oder Tabellenname benutzen in mySQL. Das ist doch nicht MS-Access, wo man NAME, BREITE, und ANZAHL nicht als Feldnamen benutzen darf, wenn man später polymorphe Formulare bauen will. Musst Du mal ausprobieren. Ist immer eine Gaudi wenn in einer Adressdatei der Typ dann plötzlich "Willi Adressverwaltung" heißt...
Ich will das jetzt aber genau wissen, ob MySQL da genauso blöd ist.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Thomas,
Seit wann darf man DATE nicht mehr als Feldname, Indexname
oder Tabellenname benutzen in mySQL.
Das hat nix mit MySQL zu tun. 'DATE' ist ein
SQL-Schluesselwort. Das darf nicht als Spalten-Namen benutzt
werden, basta. Schlags im Standard nach.
Manche DBS kommen damit vielleicht trotzdem klar, wenn man die
Feldnamen quoted (bei MySQL mit `). Aber darauf verlassen
wuerde ich mich nicht.
Mal was anderes. Ich will dir ja nicht dreinreden, mit deinem
Bild, aber der Server ist sehr selten erreichbar und irgendwie
nervt das wirklich. Immer, wenn ich deine Postings lese,
versucht der Browser dein Bild zu laden und zu laden und zu
laden und zu laden...
Gruesse,
CK
Hallo,
Hallo Thomas,
Seit wann darf man DATE nicht mehr als Feldname, Indexname
oder Tabellenname benutzen in mySQL.Das hat nix mit MySQL zu tun. 'DATE' ist ein
SQL-Schluesselwort. Das darf nicht als Spalten-Namen benutzt
werden, basta. Schlags im Standard nach.
Na, von Standard war aber eben keine Rede. Und MySQL verkraftet das hervorragend eine Tabelle zu haben, die DATE heißt und ein Feld hat, das DATE heißt und einen index hat, der DATE heißt. Überhaupt kein Problem. Der Fehler, die in diesem Thread beschrieben wurde, lag also woanders. Sooo leicht ("basta") wollen wir und das hier doch sohl nicht machen, oder? Ich jedenfalls nicht. Wenn es denn im Standard-SQL irgendwelche "Verbote" hierzu gibt, dann danke ich Dir für den Hinwei, bitte aber um einen Link auf die Standard-SQL-Definition. Die suche ich nämlich schon lange.
Mal was anderes. Ich will dir ja nicht dreinreden, mit deinem
Bild, aber der Server ist sehr selten erreichbar und irgendwie
nervt das wirklich. Immer, wenn ich deine Postings lese,
versucht der Browser dein Bild zu laden und zu laden und zu
laden und zu laden...
Ja, da hast Du Recht. Unser Provider hat leider Insolvenz angemeldet. Jetzt habe ich eine schöne Antenne auf dem Dach und die tut nix mehr. Leider hat er auch unseren Vertrag nicht eingehalten. Nun müsste ich ihn verklagen. Nur bis die Klage durch wäre, wird die Inso eröffent oder abgelehnt worden sein und der Betrieb eingestellt. Leider habe ich noch keinen neuen Access-Provider mit einer Bandbreite zwischen 2 und 10 MBit gefunden. Das wird sich hoffentlich die nächten Tage klären und unsere Server sind wieder online. Dann müsste doch das Bild wiederkommen, oder? *gg*
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Thomas,
Na, von Standard war aber eben keine Rede.
Doch. Ich sagte, 'DATE' sei in SQL ein reserviertes Wort.
Und MySQL verkraftet das hervorragend eine Tabelle zu
haben, die DATE heißt und ein Feld hat, das DATE heißt
und einen index hat, der DATE heißt.
Jups. Bis man mehrdeutige Queries hat, wie beim Order By
gerade. Und andere DBS verbieten es komplett.
bitte aber um einen Link auf die Standard-SQL-Definition.
Die suche ich nämlich schon lange.
Die gibts nicht frei verfuegbar, da musst du ziemlich viel
Geld fuer bezahlen ;) Einer der Gruende, warum ich sie nicht
habe.
Das wird sich hoffentlich die nächten Tage klären und
unsere Server sind wieder online.
Kannst du das Bild bitte bis dahin aus deinen Postings heraus
lassen? Das nervt einfach.
Dann müsste doch das Bild wiederkommen, oder? *gg*
Davon gehe ich doch mal aus.
Gruesse,
CK
Hi Christian,
$result = mysql_query( "SELECT * FROM $table ORDER BY DATE DESC" );
DATE ist ein Schluesselwort in SQL, das darf nicht als
Tabellen-Name benutzt werden. Ansonsten gibts
aussagekraeftigere Fehlermeldungen mit$result = mysql_query("query") or die(mysql_error());
Seit wann darf man DATE nicht mehr als Feldname, Indexname oder Tabellenname benutzen in mySQL. Das ist doch nicht MS-Access, wo man NAME, BREITE, und ANZAHL nicht als Feldnamen benutzen darf, wenn man später polymorphe Formulare bauen will. Musst Du mal ausprobieren. Ist immer eine Gaudi wenn in einer Adressdatei der Typ dann plötzlich "Willi Adressverwaltung" heißt...
Ich will das jetzt aber genau wissen, ob MySQL da genauso blöd ist.
Zitat von http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#Reserved_words:
Folgende Symbole (aus der obigen Tabelle) sind von ANSI-SQL verboten, aber von MySQL als Spalten- und Tabellennamen zugelassen. Der Grund ist, dass einige davon sehr natürliche Namen sind und viele Leute diese bereits in Benutzung haben.
* ACTION
* BIT
* DATE
* ENUM
* NO
* TEXT
* TIME
* TIMESTAMP
Aber der ANSI-SQL92 Standard würde mich auch mal interesieren! Wo findet man den?
Grüße
Andreas
Hallo Andreas,
Aber der ANSI-SQL92 Standard würde mich auch mal
interesieren! Wo findet man den?
Den gibt es (immer noch) fuer viel Geld beim ANSI (American
National Standards Institut). Und wenn man den schon kauft,
wuerde ich den aktuellen nehmen: den SQL99-Standard.
Gruesse,
CK
Guten Morgen,
<?php
$host = "localhost";
$user = "root";
$password = "";
$database = "cms_test";
$table = "awd_news";/* mit db verbinden */
$link = mysql_pconnect( $host, $user, $password ) or die("Verbindung zu MySQL konnte nicht hergestellt werden");
mysql_select_db( $database, $link ) or die("Datenbank-Fehler!");/* datensatz raussuchen */
$result = mysql_query( "SELECT * FROM $table ORDER BY DATE DESC" );
//»» /* datenbank schliessen */
//»» mysql_close( $link );
/* daten ausgeben */
$count = 0;
while ( $news= mysql_fetch_row( $result ) )
{
print "<p><b>$news[0] - $news[1]</b><br><font size="1">von <b>$news[5]</font></b></p><p>$news[2]</p>\n";/* abfrage, ob link oder nicht */
if($news[4] =! "") {
print "<p>hier der link: <a href="$news[3]" target="_blank"><b>$news[4]</b></a></p>\n";
}print "<img src="images/bg_black.gif" width="430" height="1">\n";
$count++;
if($count == 2)
break;
}
/* datenbank schliessen */
mysql_close( $link );
?>
Wieso das mit zwei Dateien klappt, weiß ich allerdings auch nicht. Aber not a valid Link-Resource, heißt, dass entweder das Query schiefgegangen ist, oder verlorengegangen. Wenn man das Resultset wieder freigibt (mit mysql_close()), bevor man es benutzt, kann das natürlich schon passieren...
Liebe Grüße aus http://www.braunschweig.de
Tom
Meunsen!
Hier das Beispiel mit zwei Dateien!
<?php
$host = "localhost";
$user = "root";
$password = "";
$database = "cms_test";
$table = "awd_news";
/* mit db verbinden */
$link = mysql_pconnect( $host, $user, $password ) or die("Verbindung zu MySQL konnte nicht hergestellt werden");
mysql_select_db( $database, $link ) or die("Datenbank-Fehler!");
/* datensatz raussuchen */
$result = mysql_query( "SELECT * FROM $table ORDER BY DATE DESC" );
/* datenbank schliessen */
mysql_close( $link );
?>
Das ist die erste Datei. Sie ist ganz am Anfang meiner NewsAusgabe mit "include" eingebunden.
<?php
/* daten ausgeben */
$count = 0;
while ( $news= mysql_fetch_row( $result ) )
{
print "<p><b>$news[0] - $news[1]</b><br><font size="1">von <b>$news[5]</font></b></p><p>$news[2]</p>\n";
/* abfrage, ob link oder nicht */
if($news[4] =! "") {
print "<p>hier der link: <a href="$news[3]" target="_blank"><b>$news[4]</b></a></p>\n";
}
print "<img src="images/bg_black.gif" width="430" height="1">\n";
$count++;
if($count == 2)
break;
}
?>
Das ist dann die zweite Datei. Sie wird etwas später (nach dem HTML Head und den StyleSheet Definitionen eingebunde. Auch mit "include".
Der Code ist genau der Gleiche. Ich weiss noch nicht woran es liegt, konnte es bis jetzt auch noch nicht wieder austesten, aber ich denke, es könnte an dem "ORDER BY DATE DESC" liegt, wie Christian meinte.
Falls es dann läuft (ich probiere es heute abend aus) und dieser Thread noch im Forum ist, werd ich es noch posten!
Vielen Dank! MfG. CoN.
Hallo,
leider kann man nicht sehen, wo du was included hat und wie du die Ausgabe dann aufrufst.
Der Fehler "not a valid Link resource" wird immer dan angezeigt, wenn das über den result-identifier zitierte Query $result=mysql_query($query_sting,$linkidentifier) keine Verbindung mehr zur Datenbank hat. Die Verbindung wird über einen Link-Identifier (Link-Resource) hergestellt, den Du Dir mit $linkidentifier=mysql_connect(...) besorgst. Wenn Du die DB mit db_close(linkidentifier) wieder schließt, dann wird der Identifier ungültig und das Resultset wird aus dem Speidher entfernt. damit wird auch der Result-Identifier ungültig.
Das hatte ich eben aber schon mal erklärt.
Liebe Grüße aus http://www.braunschweig.de
Tom
Meunsen!
Ok, alles klar!
Es lag an der von Christian angesprochenen "ORDER BY DATE"!
(Warum datt lüppt, wenn ich zwei Dateien habe, weiss ich auch nicht...)
Naja, auf jeden Fall Danke für die Hilfe!
MfG. CoN.
Hi!
Es lag an der von Christian angesprochenen "ORDER BY DATE"!
(Warum datt lüppt, wenn ich zwei Dateien habe, weiss ich auch nicht...)
Das kann irgendwie nicht sein. entweder die Query funktioniert oder nicht, egal wie Du die im PHP-Script erzeugst. Aber es müßte eigentlich auch mit DATE gehen, und zwar mußt Du reservierte Wörter, was DATE nunmal ist, in reserviertes Wort setzen, siehe: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#Legal_names. Mehr über reservierte Wörter findest Du hier: http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#Reserved_words
Grüße
Andreas