unexpected $end in

Alles, was PHP betrifft, kann hier besprochen werden.

Postby I-c-H » 14. August 2008 08:47

Tut mir leid, dass ich mich so lange nicht gemeldet habe.

Erst einmal:
Der Editor den du mir empfohlen hast funktioniert super, mir gefällt vor allem die Tatsache, dass er Fehler sofort anzeigt, sodass man genau weiß, WANN man diesen Fehler angefangen hat zu machen.

Ich danke dir für die ausführliche Erklärung.
Ich habe mir das mit den verschiedenen Joins erst einmal notiert, inklusive Beispiel.
Sollte ich Noch einmal Fragen diesbezüglich haben, melde ich mich.

Gruß
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby I-c-H » 14. August 2008 13:29

Hat ja gar nicht so lange gedauert...

( ! ) Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\phpdesigner_output_tmp.php on line 21
Call Stack
# Time Memory Function Location
1 0.0010 61712 {main}( ) ..\phpdesigner_output_tmp.php:0
2 0.0037 64464 mysql_fetch_array ( ) ..\phpdesigner_output_tmp.php:21

Das gibt er mir aus,
und das ist der Quelltext:

<?php
$dbcnx = @mysql_connect('localhost', 'root', '');
if (!$dbcnx) {
exit('<p> Verbindungsaufbau zum Datenbankserver' .
' zurzeit nicht möglich. </p>');}
if (!@mysql_select_db('Jokes')) {
exit('<p> Auswahl der Witzedatenbank zurzeit nicht möglich.</p>');
}
$authors = @mysql_query('SELECT ID, Name FROM autoren');
if (!$authors) {
exit('<p>Fehler beim Abruf der Autoren aus der Datenbank!<br />'.
'Error: ' . mysql_error() . '</p>');
}
while ($authors = mysql_fetch_array($authors)){
$id = $authors['ID'];
$name = htmlspecialchars($authors['Name']);
echo "<li>$name "
."<a href='editauthor.php?id=$id'>Bearbeiten</a>"
."a href='deleteauthor.php?id=$id'>Löschen</a></li>";
}
?>
</ul>


EDIT;
Ich hab den Fehler selbst entdeckt und fett markiert
Warum dürfen diese Variablen nicht gleich sein?
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby Xardas der Dunkle » 14. August 2008 13:49

KA, diese Ausführungsfunktion nutze ich nicht, da es bei einem Großprojekt wo alles über die index.php läuft (*Kopf vor Nobbies Faustschlag ein zieh*), nicht viel nützt.

Was passiert wenn du das Script anstatt darüber direkt im Browser aufrufst?

/esdit: Blargh
Code: Select all
while ($authors = mysql_fetch_array($authors)){
    $id = $authors['ID'];
    $name = htmlspecialchars($authors['Name']);


Jar ist logisch, weil das mysql_fetch_array eben bei jedem Durchlauf aufgerufen wird und schon beim ersten überschrieben wird ;).
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby I-c-H » 14. August 2008 14:01

Du lässt eine ganze Seite über ne index Datei laufen? Ich persönlich hasse solche Seiten, weil es schlecht möglich ist vor und zurück zu blättern. Es bietet sich nur bei sehr wenigen Gelegenheiten an - ist meine (unprofessionelle) Meinung.

Aber Back to TOPIC:
Es passierte nichts, man zeigte mir die oben genannte Fehlermeldung an.

Und klar, jetzt wo dus sagst: Es wäre eine Endlosschleife und damit kein Algorythmus mehr.
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby Xardas der Dunkle » 14. August 2008 14:16

In deinem post war jetzt kein einziges wahres Wort.

Du lässt eine ganze Seite über ne index Datei laufen? Ich persönlich hasse solche Seiten, weil es schlecht möglich ist vor und zurück zu blättern. Es bietet sich nur bei sehr wenigen Gelegenheiten an - ist meine (unprofessionelle) Meinung.

Das was du meinst ist Ajax, da gibt es kein Zurück.

Und klar, jetzt wo dus sagst: Es wäre eine Endlosschleife und damit kein Algorythmus mehr.

Was zu ne Endlosschleife?, Es kommt ja nicht mal zum 2ten Durchlauf wie soll es dann eine Endlosschleife geben?
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby I-c-H » 14. August 2008 14:29

Wenn es kein Algorhythmus ist, wird es auch nicht durchgeführt. Ein Algorhythmus ist eine ENDLICHE Anweisung - das da ist keine, darum wird gar nicht erst damit begonnen!

Ich habe zur ZEit keinerlei Möglichkeit das folgende zu testen, darum frage ich einfach mal, funktioniert das so:


$id = $_GET['id'];
echo'<p>Wollen Sie den Autor:<strong> ' . mysql_query("SELECT FROM autoren WHERE ID='$id'") .'</strong> wirklich löschen?';
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
'?deleteauthor='.$id.'>Ja! </a><a href="authors.php">Zurück zur Liste der Autoren</a></p>';


//Alle Witze die zum Autor gehören zusammen mit dem Autor selbst löschen.
if (isset($_GET['$id'])) {
$id1 = $_GET['id'];
$ok1 = @mysql_query("DELETE FROM Jokes WHERE AID='$id1'");
$ok1 = @mysql_query("DELETE FROM autoren WHERE ID='$id1'");
if ($ok1 and $ok2) {
echo'<p>Autor wurde erfolgreich gelöscht!</p>';
} else {
echo'<p>Fehler beim Löschen des Autors aus der Datenbank!<br />'
. 'Fehler: ' . mysql_error() . '</p>';
}[/b]
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby Xardas der Dunkle » 14. August 2008 14:38

Wenn es kein Algorhythmus ist, wird es auch nicht durchgeführt. Ein Algorhythmus ist eine ENDLICHE Anweisung - das da ist keine, darum wird gar nicht erst damit begonnen!

:x Es ist eine Endliche Anweisung ..., es ist auch kein Syntaktischer sondern ein logischer Fehler ................ !

Und nimm bitte [code]-Tags anstatt [quote]-Tags, so kann das ja kein Schwein lesen .__.

Code: Select all
$id = $_GET['id'];
echo'<p>Wollen Sie den Autor:<strong> ' . mysql_query("SELECT FROM autoren WHERE ID='$id'") .'</strong> wirklich löschen?';
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
'?deleteauthor='.$id.'>Ja! </a><a href="authors.php">Zurück zur Liste der Autoren</a></p>';

Da blutet mein Herz:
http://de.wikipedia.org/wiki/SQL_Injection
http://de3.php.net/manual/de/security.d ... ection.php

Code: Select all
if (isset($_GET['$id'])) {

Kann und wird nicht gehen.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby glitzi85 » 14. August 2008 14:52

Xardas, ganz ruhig :wink:

ich hoffe es wird mir nicht übel genommen wenn ich hier kurz Leicht-OT dazwischenposte:

Gibt es ein sinnvolles Argument gegen die Programmierung in nur einer Datei? Ist da die Performance von Apache/PHP besser, wenn alles auf verschiedene Dateien verteilt ist?

Ich mach das bisher auch alles in einer bzw. bei Login-Systemen in 2 Dateien und hatte bisher eigentlich keine Probleme. Allerdings bin ich was PHP angeht jetzt auch nicht gerade ein Profi.

mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby I-c-H » 14. August 2008 14:53

Xardas der Dunkle wrote:
Wenn es kein Algorhythmus ist, wird es auch nicht durchgeführt. Ein Algorhythmus ist eine ENDLICHE Anweisung - das da ist keine, darum wird gar nicht erst damit begonnen!

:x Es ist eine Endliche Anweisung ..., es ist auch kein Syntaktischer sondern ein logischer Fehler ................ !

Und nimm bitte [code]-Tags anstatt [quote]-Tags, so kann das ja kein Schwein lesen .__.

Code: Select all
$id = $_GET['id'];
echo'<p>Wollen Sie den Autor:<strong> ' . mysql_query("SELECT FROM autoren WHERE ID='$id'") .'</strong> wirklich löschen?';
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
'?deleteauthor='.$id.'>Ja! </a><a href="authors.php">Zurück zur Liste der Autoren</a></p>';

Da blutet mein Herz:
http://de.wikipedia.org/wiki/SQL_Injection
http://de3.php.net/manual/de/security.d ... ection.php

Alles klar!

Code: Select all
if (isset($_GET['$id'])) {

Kann und wird nicht gehen.

Wie dann? :?
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby Xardas der Dunkle » 14. August 2008 15:01

glitzi85 wrote:Xardas, ganz ruhig :wink:

ich hoffe es wird mir nicht übel genommen wenn ich hier kurz Leicht-OT dazwischenposte:

Gibt es ein sinnvolles Argument gegen die Programmierung in nur einer Datei? Ist da die Performance von Apache/PHP besser, wenn alles auf verschiedene Dateien verteilt ist?

Ich mach das bisher auch alles in einer bzw. bei Login-Systemen in 2 Dateien und hatte bisher eigentlich keine Probleme. Allerdings bin ich was PHP angeht jetzt auch nicht gerade ein Profi.

mfg glitzi

Also was Performance angeht, bin ich mir nicht so sicher.
Das kann schon ganz schön Performance schlucken, ich denke da z.B. an das CMS Silverstripe, das hat verflucht hohe Ladezeiten besonders im Adminbereich.
Aber im Grunde spricht ansonsten nix dagegen.
Fast jedes CMS arbeitet so, bei Foren ist es meist etwas anders hier wird das ganze System auf mehrere aufrufende Dateien verteilt, was aber auch an der Rückkompatibilität liegen kann.

Zitat:
Code: Select all
if (isset($_GET['$id'])) {


Kann und wird nicht gehen.

Wie dann? Confused

'$id' <== Schau dir das mal genau an :p
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby I-c-H » 14. August 2008 16:49

Ich komm wirklich nicht auf die Lösung... wenn ich das Dollarzeichen wegnehme, weiß er doch gar nicht was ich meine, oder doch?

EDIT: Um mal zu erklären was ich eigentlich will:
Ich wähle auf der Startseite die Option Autoren aus, von der Seite Autoren aus, klicke ich auf Autoren löschen (so will es mein Lehrbuch) - auf der Seite soll dann ausgegeben "Autor erfolgreich gelöscht", wenns denn geklappt hat und ein Link zurück zur Autorenauswahl stehen.
Ich will jetzt aber das kleine Extra einbauen, dass der User auf "Autor löschen" klickt, auf die Löschseite kommt, bestätigen soll, dass er diesen WIRKLICH löschen will und erst DANN soll der Autor wirklich gelöscht werden + ausgegeben werden, dass es erfolgreich war + Link zurück zur Startseite.

Ich weiß auch ehrlich gesagt nicht, was ich mit nem Array soll? Mit der englischen Seite kann ich nicht viel anfangen :(.
Mir kam sonst noch die Idee, dass ich beim Ausführen der Anweisung eigentlich nicht den selben Wert in zwei Variablen benötige, oder doch?

Danke für die Hilfe!
Last edited by I-c-H on 14. August 2008 17:13, edited 1 time in total.
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby glitzi85 » 14. August 2008 16:57

User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby I-c-H » 14. August 2008 17:29

Xardas, ich muss doch noch mal nachhaken, es ist doch nicht alles klar - wie kann ich dieses Script denn sicherer machen? Mir ist klar, dass ich die ID über das GET Verfahren reinhole - eigentlich falsch, Post wäre sicherer, aber was ist sonst noch im Code verkehrt?

Bitte beachtet mein editiertes Posting über mir.

EDIT:

Code: Select all
$id = $_GET['id'];
echo'<p>Wollen Sie den Autor:<strong> ' . mysql_query("SELECT FROM autoren WHERE ID='$id'") .'</strong> wirklich löschen?';
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
   '?yes>Ja! </a><a href="authors.php">Zurück zur Liste der Autoren</a></p>';
   

//Alle Witze die zum Autor gehören zusammen mit dem Autor selbst löschen.
if (isset($_GET['yes'])) {
 
$ok1 = @mysql_query("DELETE FROM Jokes WHERE AID='$id'");
$ok1 = @mysql_query("DELETE FROM autoren WHERE ID='$id'");

if ($ok1 and $ok2) {
   echo'<p>Autor wurde erfolgreich gelöscht!</p>';
   } else {
      echo'<p>Fehler beim Löschen des Autors aus der Datenbank!<br />'
      . 'Fehler: ' . mysql_error() . '</p>';
   }
   }

Das war jetzt meine fixe Idee. Ich kanns aber wie gesagt nur auf Syntax prüfen, nicht auf Funktionsweise, da das dafür notwendige Dokument nicht auf meinem Rechner liegt.

So, ich hab das jetzt mal selbst korrigiert:
Code: Select all
<?php
//Alle Witze die zum Autor gehören zusammen mit dem Autor selbst löschen.
if (isset($_GET['deleteauthor'])) {
 
$ok1 = @mysql_query("DELETE FROM Jokes WHERE AID='$id'");
$ok2 = @mysql_query("DELETE FROM autoren WHERE ID='$id'");

if ($ok1 and $ok2) {
   echo'<p>Autor wurde erfolgreich gelöscht!</p>';
   } else {
      echo'<p>Fehler beim Löschen des Autors aus der Datenbank!<br />'
      . 'Fehler: ' . mysql_error() . '</p>';
   }
   }
   
else {

$dbcnx = @mysql_connect('localhost', 'root', '');
if (!$dbcnx) {
   exit('<p>Verbindung zur Datenbank zur Zeit nicht möglich</p>.');
}
if (!@mysql_select_db('Jokes')){
   exit('<p>Auswahl der Witzedatenbank zurzeit nicht möglich</p>');
}


$id = $_GET['id'];
echo'<p>Wollen Sie den Autor:<strong> ' . mysql_query("SELECT FROM autoren WHERE ID='$id'") .'</strong> wirklich löschen?';
echo'<a href="'.$_SERVER['PHP_SELF'].'?deleteauthor='.$id.'">'
.'<p>Ja! </a>'
."<a href='authors.php'>Zurück zur Startseite</a>";
}
?>


Jetzt erzählt er mir (konnte das via Trick ausprobieren):
Fehler: Access denied for user 'ODBC'@'localhost' (using password: NO)

Warum?

Ich weiß, meine Fragerei ist vielleicht etwas anstrengend und diese Witzedatenbank ist kein persönliches Anliegen, sondern reine Lernaufgabe aus einem Lehrbuch.
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

Postby Xardas der Dunkle » 14. August 2008 18:08

Ich komm wirklich nicht auf die Lösung... wenn ich das Dollarzeichen wegnehme, weiß er doch gar nicht was ich meine, oder doch?

Wie währe es wenn du anstatt dem $ mal die ' weg nimmst?

Xardas, ich muss doch noch mal nachhaken, es ist doch nicht alles klar - wie kann ich dieses Script denn sicherer machen? Mir ist klar, dass ich die ID über das GET Verfahren reinhole - eigentlich falsch, Post wäre sicherer, aber was ist sonst noch im Code verkehrt?

http://de3.php.net/manual/de/function.intval.php
http://de3.php.net/manual/de/function.m ... string.php
http://de3.php.net/manual/de/function.h ... lchars.php

Code: Select all
$ok1 = @mysql_query("DELETE FROM Jokes WHERE AID='$id'");
$ok2 = @mysql_query("DELETE FROM autoren WHERE ID='$id'");

Wo kommt nun das $id her?^^
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby I-c-H » 14. August 2008 18:29

Also: Ich habe ein funktionierendes Script.

Allerdings connecte ich zwei mal die Datenbank UND die Idee vom Anfang hab ich immer noch nicht umgesetzt.

Das wäre die erste Idee, nach jetzigem Stand:
Code: Select all
<?php

$dbcnx = @mysql_connect('localhost', 'root', '');
if (!$dbcnx) {
   exit('<p>Verbindung zur Datenbank zur Zeit nicht möglich</p>.');
}
if (!@mysql_select_db('Jokes')){
   exit('<p>Auswahl der Witzedatenbank zurzeit nicht möglich</p>');
}

$id = $_GET['id'];
echo'<p>Wollen Sie den Autor:<strong> ' . mysql_query("SELECT FROM autoren WHERE ID='$id'") .'</strong> wirklich löschen?';
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
'?deleteauthor='.$id.'>Ja! </a><a href="authors.php">Zurück zur Liste der Autoren</a></p>';


//Alle Witze die zum Autor gehören zusammen mit dem Autor selbst löschen.
if (isset($_GET[$id])) {
 
$ok1 = @mysql_query("DELETE FROM Jokes WHERE AID='$id'");
$ok1 = @mysql_query("DELETE FROM autoren WHERE ID='$id'");
}
if ($ok1 and $ok2) {
echo'<p>Autor wurde erfolgreich gelöscht!</p>';
} else {
echo'<p>Fehler beim Löschen des Autors aus der Datenbank!<br />'
. 'Fehler: ' . mysql_error() . '</p>';
}
?>

Wie du siehst habe ich die funktionierenden Parts zusammengefügt.
Ich weiß aber immer noch nicht, wie ich über einen Klick auf JA die ID übergebe (ohne mit einer _GET Variable zu arbeiten - frag bitte nach, wenn du nicht weißt, wie ichs mein).
I-c-H
 
Posts: 24
Joined: 20. July 2008 16:20

PreviousNext

Return to PHP

Who is online

Users browsing this forum: No registered users and 2 guests