PHP/SQL-Programmierproblem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

PHP/SQL-Programmierproblem

Beitrag von mj23 » 03.09.2005 14:50:09

Bekomme vom Browser folgende Ausgabe:
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ../newgame.php on line 19

Hier der Quellcode von der PHP-Datei:

Code: Alles auswählen

<?php require("connect.inc.php");
?>
<html>
<head><TITLE></TITLE></head>
<body>
<?php
if(isset($_GET['abschicken'])==0){
?>
<form name="tableform" action="" method="post">
Datum: <input type=text value=YYYY-MM-DD name=date><br><br>
Uhrzeit: <input type=text value=HH-MM-SS name=time><br><br>
Mannschaft: <input type=text name=team><br><br>
Gegner: <input type=text name=op><br><br>
Halle: <input type=text name=halle><br><br>
<input type=submit name=abschicken>
</form>
<?php
} else {
$SQL_statement = "INSERT INTO table (date, time, team, op, halle) VALUES ($_POST['date'], $_POST['time'], $_POST['team'], $_POST['op'], $_POST['halle'])";
mysql_query($SQL_statement);
mysql_close();
}
?>
Eingabe erfolgreich
</body>
</html>
und die Zeile 19:

Code: Alles auswählen

$SQL_statement = "INSERT INTO table (date, time, team, op, halle) VALUES ($_POST['date'], $_POST['time'], $_POST['team'], $_POST['op'], $_POST['halle'])";
Ich habe die Post-Arrays auch schon in Anführungszeichen gesetzt:

Code: Alles auswählen

$SQL_statement = "INSERT INTO table (date, time, team, op, halle) VALUES ("$_POST['date']", "$_POST['time']", "$_POST['team']", "$_POST['op']", "$_POST['halle']")";
Bekomme dann folgende Ausgabe im Browser:
Parse error: parse error, unexpected T_VARIABLE in /www/htdocs/v149265/schiedsrichter/newgame.php on line 19

Suche schon verzweifelt nach dem Fehler...ist bestimmt nur eine Kleinigkeit, aber für mich unauffindbar :-(

Mark

Benutzeravatar
Erdbeer-Schorsch
Beiträge: 219
Registriert: 31.07.2003 23:59:34
Kontaktdaten:

Beitrag von Erdbeer-Schorsch » 03.09.2005 15:01:23

Moin!

Nimm mal das:

Code: Alles auswählen

$SQL_statement = "INSERT INTO table (date, time, team, op, halle) VALUES (".$_POST["date"].", ".$_POST["time"].", ".$_POST["team"].", ".$_POST["op"].", ".$_POST["halle"].")"; 
Gruß

Schorsch

PS: Mit dem . werden Strings verbunden. Bei deiner Lösung oben kommt der Parser durcheinander da als Array-Index ebenfalls ein String genommen wird.
( 0x2b || !0x2b )

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 03.09.2005 16:20:46

Vielen dank!
Es hat geklappt.

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 03.09.2005 19:28:09

Von Smalltalk weggeschoben.

bye, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 09:51:05

Bevor dieser Thread im Forum versauert und nie wieder angeschaut wird, füge ich einfach mal noch ein Problem hinzu:

In meiner SQL-Datenbank werden die Eintragungen doppelt vorgenommen, d.h. es wird die auto_increment-id erhöht und dann wird nochmal dasselbe in den anderen Spalten eingetragen.
Hier der Code:

Code: Alles auswählen

<?php require("connect.inc.php");
?>
<html>
<head><TITLE></TITLE></head>
<body>

<?php
if(isset($_GET['submit'])==0){ ?>
<form name="tableform" action="<?php $PHP_SELF ?>" method="get">
Datum: <input type=text value=YYYY-MM-DD name=date><br><br>
Uhrzeit: <input type=text value=HH:MM:SS name=time><br><br>
Mannschaft: <input type=text name=team><br><br>
Gegner: <input type=text name=op><br><br>
Halle: <input type=text name=halle><br><br>
<input type=submit name=submit>
</form>

<?php
} else {
$date = $_GET['date'];
$time = $_GET['time'];
$team = $_GET['team'];
$op = $_GET['op'];
$halle = $_GET['halle'];
$query = "INSERT INTO games(date,time,team,op,halle) VALUES('$date', '$time', '$team', '$op', '$halle')";
mysql_query($query);
if(mysql_query($query)){ 
echo '<p align="center">Neues Spiel wurde eingetragen!<br><br><a href="newgame.php">Anderes Spiel eintragen</a></p>'; 
}else{ 
echo '<p align="center">Bei der Eintragung des Spiels trat leider ein Fehler auf!<br><br><a 
href="newgame.php">Zurück</a></p>'; 
} 
}
mysql_close();
?>

</body>
</html>

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.09.2005 10:01:02

ist auch klar!

Code: Alles auswählen

mysql_query($query);
if(mysql_query($query)){ 
du darfst das erste Query nicht machen.. denn er führt das Query bei jedem Aufruf aus!

BTW: du solltest die Eingaben besser prüfen.. wenn du einfach nur die Werte die im Formular waren übenimmst, dann ist das nen typisches Sicherheitsloch, da man an MySQL unter umständen Befehel abschicken kann..
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 10:22:32

oh...danke...habe nicht gedacht, dass der Befehl in der Schleife ausgeführt wird, sondern nur eine Überprüfung ist, ob mysql_query true oder false zurückgibt. danke nochmal.

Zur Sicherheit:
Danke für den Hinweis, habe die strip_tags()-Funktion benutzt.
Wäre sowieso nur ein geschützter Bereich, in den nur ich als admin komme, um neue Spiele einzutragen.Aber sicher ist sicher.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.09.2005 10:38:56

mj23 hat geschrieben:Aber sicher ist sicher.
true true!
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

languitar
Beiträge: 80
Registriert: 07.03.2005 17:06:42
Kontaktdaten:

Beitrag von languitar » 04.09.2005 11:13:15

Take a look here!

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 12:06:48

Danke languitar für den Link.
Mein Passwort-Login ist mit MD5 verschlüsselt, da braucht man ja nicht unbedingt die Funktion oder vielleicht doch? Man könnte ja den Befehl: '' OR 1=1
in MD5 verschlüsseln lassen und dann in das Pwasswort-Feld eingeben oder nicht?

Ich habe schon wieder ein weiteres Problem und wieder alles ausprobiert:

Code: Alles auswählen

<?php 
require("connect.inc.php");
$id_max="SELECT last_insert_id() FROM games";
$id_query=mysql_query($id_max);
$id_count=mysql_num_rows($id_query);

for($i=1; $i<=$id_count; $i++) {
$date_statement="SELECT date FROM games WHERE idgame=$i";
$date_query=mysql_query($date_statement);
?>
<tr>
<td> <?php echo $date_query; ?></td>
</tr>
<?php
}
?>
die for-schleife funktioniert...das Problem ist irgendwo in dieser Zeile (glaub ich):

Code: Alles auswählen

$date_statement="SELECT date FROM games WHERE idgame=$i";
der Quellcode stellt eine include datei dar, die dann in eine andere datei zwischen table-tags geladen wird.
Mein Browser zeigt aber statt dem Datum folgendes:
Resource id #6
Resource id #7
Resource id #8

Habe schon $i in '' oder "" gesetzt...hat nicht funktioniert...und wenn ich in meiner SQL-Datenbank den Befehl
SELECT date FROM games WHERE idgame=1
eingebe, dann wird auch ohne weiteres das Datum ausgegeben...irgendwie habe ich was mit den Variablen nicht richtig verstanden

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 04.09.2005 12:16:33

hi,


du hast ja nur das mysql_query gemacht, was dir eine resource id zurückliefert, wie du ja auch siehst.. du musst noch mysql_fetch_row benutzen, um den inhalt des ergebnisdatensatzes zurückzubekommen.
siehe http://de3.php.net/manual/de/function.m ... ch-row.php
mfg
mauser

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 12:46:26

Danke, hat geklappt. Hier der verbesserte Code:

Code: Alles auswählen

<?php 
require("connect.inc.php");
$id_max="SELECT last_insert_id() FROM games";
$id_query=mysql_query($id_max);
$id_count=mysql_num_rows($id_query);

for($i=1; $i<=$id_count; $i++) {
$result = mysql_query("SELECT date, time, team, op, halle, sr1, sr2 FROM games WHERE idgame = $i");
$row = mysql_fetch_row($result);;
?>
<tr>
<td><?php echo $row[0]; ?></td>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td><?php echo $row[4]; ?></td>
<td><?php echo $row[5]; ?></td>
<td><?php echo $row[6]; ?></td>
</tr>
<?php
}
?>

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 19:38:18

Nachdem ich es heute jetzt schon geschafft habe eigene Codes ohne Hilfe zu schreiben, brauche ich wieder euren Rat.
<?php
require("connect.inc.php");
$id_max="SELECT last_insert_id() FROM games";
$id_query=mysql_query($id_max);
$id_count=mysql_num_rows($id_query);

for($i=1; $i<=$id_count; $i++) {
$result = mysql_query("SELECT date, time, team, op, halle, sr1, sr2 FROM games WHERE idgame = $i");
$row = mysql_fetch_row($result);;
?>
<tr>
<td><?php echo $row[0]; ?></td>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td><?php echo $row[4]; ?></td>
<td><?php echo $row[5]; ?></td>
<td><?php echo $row[6]; ?></td>
<form name="srbuttons" action="<?php $PHP_SELF ?>" method="get">
<td><input type=submit name=<?php echo "sr1". $i ;?> value="eintragen"></td>

<td><input type=submit name=<?php echo "sr2". $i ;?> value="eintragen"></td>
</form>
</tr>
<?php
$sr1finish[]=array("sr1" . $i);
$sr2finish[]=array("sr2" . $i);
}
if(isset($_GET['$sr1finish[]'])==1){
$idgamesr1=substr("$sr1finish[]", 3);
$addsr1="INSERT INTO games(sr1) VALUES('$_SESSION['user']') WHERE idgame = $idgamesr1";
mysql_query($addsr1);
}
elseif(isset($_GET['$sr2finish[]'])==1){
$idgamesr2=substr("$sr2finish[]", 3);
$addsr2="INSERT INTO games(sr2) VALUES('$_SESSION['user']') WHERE idgame = $idgamesr2";
mysql_query($addsr2);
}
?>
Habe Buttons in die Tabelle hinzugefügt, welche alle eine ganz bestimmte Identifikation bekommen:

Code: Alles auswählen

<form name="srbuttons" action="<?php $PHP_SELF ?>" method="get">
<td><input  type=submit name=<?php echo "sr1". $i ;?> value="eintragen">
Im darauffolgenden Code werden die speziellen Koordinaten der zwei Buttons in zwei Arrays gespeichert:
$sr1finish[]=array("sr1" . $i);
$sr2finish[]=array("sr2" . $i);
Anschließend wird ermittelt welcher Button gedrückt wurde, dann die ersten drei Buchstaben entfernt also sr1 oder sr2, damit die Datenbank weiß in welcher Zeile der Benutzername eingetragen werden muss.
if(isset($_GET['$sr1finish[]'])==1){
$idgamesr1=substr("$sr1finish[]", 3);
$addsr1="INSERT INTO games(sr1) VALUES('$_SESSION['user']') WHERE idgame = $idgamesr1";
mysql_query($addsr1);
}
elseif(isset($_GET['$sr2finish[]'])==1){
$idgamesr2=substr("$sr2finish[]", 3);
$addsr2="INSERT INTO games(sr2) VALUES('$_SESSION['user']') WHERE idgame = $idgamesr2";
mysql_query($addsr2);
Das Problem liegt (glaube ich) bei der Initialisierung von $idgamessr1 und $idgamessr1 da kein bestimmtes Array eingetragen ist sondern nur eckige Klammern ohne Inhalt...
wie kann ich denn das durch den Button bestätigte Array angeben?

Vielen Dank für die weitere Hilfe...falls irgendjemand überhaupt Lust hat, den langen Beitrag hier zu lesen.

languitar
Beiträge: 80
Registriert: 07.03.2005 17:06:42
Kontaktdaten:

Beitrag von languitar » 04.09.2005 19:53:12

Eigentlich bist du mit solchen Sachen in einem PHP-Forum grundsätzlich besser aufgeoben.
Take a look here!

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 20:19:08

ich weiß...hätte aber gedacht, dass auch hier solche Fragen gestellt werden dürfen...außerdem könnte man vielleicht unter diesem thema alle php/sql fragen stellen :-)...wäre doch auch was feines...

languitar
Beiträge: 80
Registriert: 07.03.2005 17:06:42
Kontaktdaten:

Beitrag von languitar » 04.09.2005 20:20:50

das wäre ein endlos-topic ;)
Take a look here!

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 04.09.2005 20:20:57

hi,

naja ich bin mir sicher das wir das auch so auf die reihe bekommen, ist ja schliesslich php und net lisp oder tcl ;-)

also erstmal würde ich dir gerne ein paar tipps geben.

1.

Code: Alles auswählen

<td><?php echo $row[0]; ?></td>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td><?php echo $row[4]; ?></td>
<td><?php echo $row[5]; ?></td>
<td><?php echo $row[6]; ?></td>
das brennt mir in den augen ;-)

Code: Alles auswählen

foreach($row as $item)
{
     print "<td>$item</td>";
}
[edit] ups, aus versehen auf absenden geklickt.. naja der rest folgt gleich

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 04.09.2005 20:32:35

2.
$sr1finish[]=array("sr1" . $i);

der sinn von diesem ausdruck ist mir nicht wirklich klar.. warum definierst du array mit einem element ? ich meine dann tut es eine einfache variable doch auch.

du musst ein array auch nicht mit $test[] ansprechen, das ist so nicht richtig. arrays werden wie ganz normale variablen. du brauchst den operator [] nur , wenn du auf ein element des arrays zugreifen willst. z.b. $test[0] = "hallo welt".

3. rück deinen code ein !
4. kommentiere deinen code !
5. lies ein php tutorial !

ich würde sagen schau dir erstmal in einem php tutorial die array sachen genau an, überarbeite deinen code nochmal und dann poste ihn hier nochmal, vll, wird es dann auch klarer was genau du überhaupt machen willst..
mfg
mauser

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 04.09.2005 22:42:58

Danke für die Tipps. :-) Habe schon einige PHP Bücher gelesen, komme nur manchmal mit der Initialisierung von Variablen und Arrays durcheinander, weil ich mich auch mit C++ beschäftige.
$sr1finish[]=array("sr1" . $i);

der sinn von diesem ausdruck ist mir nicht wirklich klar.. warum definierst du array mit einem element ? ich meine dann tut es eine einfache variable doch auch.
danke auch dafür...
sollte eigentlich $sr1finish=array("sr1" .$i); heißen

Dieser Ausdruck dient dazu, dass die Namen der Buttons in einem Array gespeichert werden und dann mittels

Code: Alles auswählen

if(isset($_GET['$sr1finish[]'])==1){}
herausgefunden wird, welches Button an welcher Position gedrückt wurde um seinen Usernamen einzutragen.

Dann wird der Username in der Zelle eingetragen, die mit der Spalte sr1 und der Zeile, die mittels

Code: Alles auswählen

substr()
wieder aus der "Buttonkoordinate" geholt wird.
D.h. die "Buttonkoordinate" besteht aus der Spaltenbezeichnung "sr1" und dem $i Zähler aus der for-Schleife (der $i gibt gleichzeitig auch die Zeilenbezeichnung)

Habe es jetzt so gut wie es geht probiert zu erklären. :wink:
Hoffe es war jetzt einigermaßen verständlich.
Grüße

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 05.09.2005 18:00:37

$sr1finish=array("sr1" . $i);
das macht immer noch keinen sinn, auch nach deiner verbesserung. du erstellst ja bei jedem durchlauf der schleife ein neues array, immer nur mit einem element..
(ich glaub durch das ganze programm blick ich eh net durch, am besten ist du beschreibst genau wo ein fehler kommt..)
mfg
mauser

mj23
Beiträge: 62
Registriert: 30.04.2004 13:48:06

Beitrag von mj23 » 05.09.2005 20:02:55

so...habe den code umgeschrieben...ist jetzt wahrscheinlich verständlicher:

Code: Alles auswählen

<?php 
    }

    for($i=0; $i<=$id_count; $i++) {
        $b=$i+1;
        $sr1button[$i] = "sr1".$b;
        $sr2button[$i] = "sr2".$b;
    }

    if(isset($_GET['$sr1button[*]'])==1){
        $sr1= $GET['$sr1button[*]'];
        $idgame=substr("$sr1", 3);
        $sr1_query="INSERT INTO games(sr1) VALUES('$_SESSION['user']') WHERE idgames="$idgame"";

# hier fehlt doch ein } ??
# }  elseif(isset($_GET['$sr2button[*]'])==1) {


    elseif(isset($_GET['$sr2button[*]'])==1){
        $sr2= $GET['$sr1button[*]'];
        $idgame=substr("$sr1", 3);
        $sr2_query="INSERT INTO games(sr2) VALUES('$_SESSION['user']') WHERE idgames="$idgame"";
    }
} 
?>
Der Browser gibt mir folgende Meldung aus...

Code: Alles auswählen

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ... on line 33
Das ist diese Zeile:

Code: Alles auswählen

$sr1_query="INSERT INTO games(sr1) VALUES('$_SESSION['user']') WHERE idgames="$idgame"";
---------------------------------------------------------------------------------------------------------
Kann man überhaupt im folgenden Beispiel so auf ein Array zugreifen? Denn man weiß nicht welches Array die Koordinate für den Button gespeichert hat
und deshalb wird nach dem Button-Array gesucht das gedrückt wurde (es kann nur eins gedrückt werden):

Code: Alles auswählen

if(isset($_GET['$sr1button[*]'])==1){
$sr1= $GET['$sr1button[*]'];

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 05.09.2005 20:19:51

hi,

du solltest dir wirklich mal deine php bücher etwas genauer durchlesen...
$sr2_query="INSERT INTO games(sr2) VALUES('$_SESSION['user']') WHERE idgames="$idgame"";
schau dir mal das kapital über strings an, grad wie man die quoted. es ist deshalb auch immer besser, wenn du sowas machst:
$user=$_SESSION['user'];
$sr2_query="INSERT INTO games(sr2) VALUES('$user') WHERE idgames=$idgame;
$idgame=substr("$sr1", 3);
du benötigst du keine double-quotes..
$GET['$sr1button[*]
ich glaube nicht das das syntaktisch korrekt ist ;-) wieso nimmst du eigentlich keinen radio buttons anstatt das alles so kompliziert zu machen ?
mfg
mauser

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 06.09.2005 08:18:15

sorry.. ich hab mal versucht es etwas übersichtlicher zu gestalten... und noch einen Kommentar eingefügt!

Fehlt da vor dem elsif nicht noch ein } ?
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Antworten