Werte addieren

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Antworten
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Werte addieren

Beitrag von Holger »

Moin,

ich versuche gerade einen Teil in meinem Skript hinzuzufügen, mit dem man sagen kann "Ich war auch da".

Die Anzeige funktioniert schonmal:

Code: Alles auswählen

		Mitglieder, die schonmal dort waren:<br />
		<?php
		if ($r['wasthere']=='')
		{
			echo("ingen");
		}
		else
		{
			echo('' . $r['wasthere'] . '');
		}
		?>
Die Seite soll einfach neu geladen werden, sobald jemand auf den Button klickt:

Code: Alles auswählen

		<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
		<input type="submit" value="Ich bin dort gewesen!">
		</form>
Die Auswertung weiter oben im Script:

Code: Alles auswählen

if(isset($_POST['submit']) AND $_POST['submit']=='Ich bin dort gewesen!')
	{
	$act = "UPDATE mat_restaurant SET wasthere=CONCAT(`wasthere`, '$userdata[username]') WHERE id=$id";
	mysql_query($act) or die(mysql_error());
	echo"Danke!";
	}
Leider bekomme ich eine Fehlermeldung. Ausserdem wird die Seite ohne Parametern aufgerufen.

Woran müsste ich denken?

Gruss
Holger
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Leider bekomme ich eine Fehlermeldung.
Und welche?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Wenn ich auf die Schaltfläche klicke, wird die Seite ohne Parametern neu geladen.
Välj restaurang!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 '' at line 1
"Välj restauraung!" wird erzeugt, wenn die Seite ohne ID aufgerufen wird.
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Und dann überlege bitte, warum dann $id leer ist.
Zumal in der Sql-Anweisung die Variable abgesichert werden sollte.
Wie (int) $id wäre hier angebracht.
Das aber dann nach id = " ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

:wall: :D

Ich versuche es! Danke!
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Mist! Ich komme nicht voran! :wall:

Muss ich in der Form auch die ID mitschicken?
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Was soll denn die $id darstellen?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Die id des aktuellen Eintrages ^1
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Ja das ist mir ja klar, aber warum dann von dir die Frage, ob du die mitschicken sollst oder nicht, wenn du dir die Antwort doch schon selber gibst...
Woher soll denn das Script dann sonst wissen, welche ID es nun zu verarbeiten gilt?
Schließlich kommt die ja nicht von selber von "irgendwoher" ;) *bitte mich heute nicht all zu ernst nehmen*

Am besten eben mit einem "hidden"-input im Template die ID in das Formular einfügen, damit es nach einem Submit übergeben werden kann und in das Formular eben mittels echo $id; schreiben.
Dann kann die ID im Script auch wieder ausgelesen und verwendet werden.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Das hatte ich schonmal versucht, aber ich mache einen entscheidenden Fehler irgendwo

Geht nicht:

Code: Alles auswählen

<input type="hidden" name="id" value="<?php echo('' . $r['id'] . '');?>">

Code: Alles auswählen

<input type="hidden" name="id" value="<?php echo('' . $id . '');?>">

Code: Alles auswählen

<input type="hidden" name="id" value="<?php echo $id; ?>">
:wall:

Mittlerweile glaube ich es liegt an was anderem ...
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Wenn dann noch so:

Code: Alles auswählen

<input type="hidden" name="id" value="<?php echo $r['id']; ?>">
Aber du musst dann id auch noch übernehmen!
Also am besten vor

Code: Alles auswählen

 $act = "UPDATE mat_restaurant SET wasthere=CONCAT(`wasthere`, '$userdata[username]') WHERE id=$id";
das einfügen:

Code: Alles auswählen

$id = (isset($HTTP_POST_VARS['id'])) ? intval($HTTP_POST_VARS['id']) : 0;
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Hm, ich habe ja dies:

Code: Alles auswählen

mysql_connect("xyz", "xyz", "xyz");
// Här väljer vi vilken databas vi ska använda.
mysql_select_db("xyz");

$id=$_GET["id"]; //Get the ID
if($id == "") echo"Välj restaurang!"; //If no id is set, default to errormessage

$activation=$_GET["aktivering"];
if($activation=="1") {
	$act = "UPDATE mat_restaurant SET activated=1 WHERE id=$id";
	mysql_query($act) or die(mysql_error());
	echo"Aktiverat!";
	}

if(isset($_POST['submit']) AND $_POST['submit']=='Jag har varit där!')
	{
	$visited = "UPDATE mat_restaurant SET wasthere=CONCAT(`wasthere`, '$userdata[username]') WHERE id=$id";
	mysql_query($visited) or die(mysql_error());
	echo"Tack!";
	}

$result = mysql_query("SELECT * FROM mat_restaurant WHERE id=$id");
$viewsupdate = "UPDATE mat_restaurant SET views=views+1 WHERE id=$id";
mysql_query($viewsupdate) or die(mysql_error());
$r = mysql_fetch_array($result)
Es geht ja um dieses:

Code: Alles auswählen

if(isset($_POST['submit']) AND $_POST['submit']=='Jag har varit där!')
	{
	$visited = "UPDATE mat_restaurant SET wasthere=CONCAT(`wasthere`, '$userdata[username]') WHERE id=$id";
	mysql_query($visited) or die(mysql_error());
	echo"Tack!";
	}
Das müsste dann so aussehen?

Code: Alles auswählen

if(isset($_POST['submit']) AND $_POST['submit']=='Jag har varit där!')
	{
	$id = (isset($HTTP_POST_VARS['id'])) ? intval($HTTP_POST_VARS['id']) : 0;
	$visited = "UPDATE mat_restaurant SET wasthere=CONCAT(`wasthere`, '$userdata[username]') WHERE id=$id";
	mysql_query($visited) or die(mysql_error());
	echo"Tack!";
	}
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Habe beides versucht, bekomme weiterhin
Välj restaurang!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 '' at line 1
Das heisst, die ID wird weiterhin nicht übergeben?
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Der Platz für die Übernahme der ID ist korrekt. Wenn du aber schon die Kurzform der Super Globals verwendest, solltest du aus $HTTP_POST_VARS auch $_POST machen.

Nun, der Fehler in der SQL-Anweisung liegt nicht bei der $is, sondern daran, wie du die User-ID einbindest.
Versuche also mal anstelle

Code: Alles auswählen

$visited = "UPDATE mat_restaurant SET wasthere=CONCAT(`wasthere`, '$userdata[username]') WHERE id=$id";
dieses hier:

Code: Alles auswählen

$visited = "UPDATE mat_restaurant SET wasthere = CONCAT(`wasthere`, '" . $userdata['username'] . "') WHERE id=" . (int) $id;
Das (int) vor $id ist ein zusätzliches Sicherheitfeature, da damit der Wert in $id auch wirklich als Zahl dargestellt wird.
Um diese SQL-Anweisung aber maximal abzusichern, sollte sie in diese Form geändert werden:

Code: Alles auswählen

$sql_wasthere = str_replace("\'", "''", 'wasthere' . $userdata['username']);
$visited = "UPDATE mat_restaurant SET wasthere = '" . $sql_wasthere . "') WHERE id = " . (int) $id;
Damit werden einfache Hochkommas in Usernamen nicht zum SQL-Killer und auch SQL-Injections verlieren so ihre Wirkung.
Ebenso ist der Code so viel besser zu lesen und später auch einfacher zu erweitern.
Das gesamte Script würde ich also eher so erstellen:

Code: Alles auswählen

    mysql_connect('xyz', 'xyz', 'xyz');
    // Här väljer vi vilken databas vi ska använda.
    mysql_select_db('xyz');

    $id = (isset($_GET['id'])) ? intval($_GET['id']) : intval($_POST['id']); //Get the ID
    if($id == '')
	{
		die 'Välj restaurang!'; //If no id is set, default to errormessage
	}

    $activation = $_GET['aktivering'];
 
    if($activation == '1')
	{
       $act = 'UPDATE mat_restaurant SET activated = ' . true . ' WHERE id = ' . (int) $id;
       mysql_query($act) or die(mysql_error());
       echo 'Aktiverat!';
    }

    if(isset($_POST['submit']) AND $_POST['submit'] == 'Jag har varit där!')
    {
       $sql_wasthere = str_replace("\'", "''", 'wasthere' . $userdata['username']);
	   $visited = "UPDATE mat_restaurant SET wasthere = '" . $sql_wasthere . "' WHERE id = " . (int) $id;
       mysql_query($visited) or die(mysql_error());
       echo 'Tack!';
    }

    $result = mysql_query('SELECT * FROM mat_restaurant WHERE id = ' . (int) $id);
    $viewsupdate = 'UPDATE mat_restaurant SET views = views + 1 WHERE id=' . (int) $id;
    mysql_query($viewsupdate) or die(mysql_error());
    $r = mysql_fetch_array($result);
Also alles mit möglichst einfachen Hochkommas (ist schneller als doppelte Hochkommas, auch wenn man das bei diesem sehr überschaubaren Script nicht sofort merkt) und die $id gleich am Anfang aus $_GET, bzw. $_POST übernehmen, damit man die ID aus einer URL gleichwohl aus einem Formular auslesen kann und sich über die Quelle später keine Gedanken mehr machen muss (Merke. $_GET = Daten einer URL, $_POST = Daten eines Formulars - zumindest im Groben...).
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Oha! Danke für die ausführliche Erklärung!
Ich werde dies jetzt mal testen!
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Leere weisse Seite :-(
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Leer bereits beim Aufruf oder nach dem Absenden des Formulars?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Leer bereits beim Aufrufen ...
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Kannst du mir mal das gesamte Script zukommen lassen?
Ich kann so erst einmal keinen Fehler finden.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Skicke ich Dir gerne morgen!
Ansonsten liegt es im Ordner /mat/
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Okay, ich habe das Script gefunden und nach der "neuen" Methode aufgebaut.
Die Details lassen sich damit nun anschauen.
Und er scheint auch nun korrekt zu speichern...

Das Original ist aber auch als details.php.old gespeichert.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

oxpus hat geschrieben:Okay, ich habe das Script gefunden und nach der "neuen" Methode aufgebaut.
Die Details lassen sich damit nun anschauen.
Und er scheint auch nun korrekt zu speichern...

Das Original ist aber auch als details.php.old gespeichert.
Wooohps! Danke!
Ich werde es mal studieren und lernen!
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Hm, irgendwie bekomme ich das trotzdem nicht hin.
Im wasthere-Feld wird nichts gespeichert ...
Ich bin echt zu blöd!
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Werte addieren

Beitrag von oxpus »

Ich habe das nun mal korrigiert.
So schaut nun der Teil aus, der genau das speichern soll:

Code: Alles auswählen

if (isset($_POST['action']) && $_POST['action'] == 'jhvd')
{
	$existing = "SELECT wasthere FROM mat_restaurant WHERE id = " . (int) $id;
	$result = mysql_query($existing) or die(mysql_error());
	$r = mysql_fetch_array($result);
	if (!in_array($userdata['username'], explode(', ', $r['wasthere'])))
	{
		$sql_wasthere = $r['wasthere'] . (($r['wasthere'] == '') ? '' : ', ') . str_replace("\'", "''", $userdata['username']);
		$visited = "UPDATE mat_restaurant SET wasthere = '" . $sql_wasthere . "' WHERE id = " . (int) $id;
		mysql_query($visited) or die(mysql_error());
	}
	echo 'Tack!';
}
Dazu habe ich in das Formular das Hidden-Field action="jhcd" eingefügt, da das Submit eigentlich "leer" ist.
Nur so wird die o. g. Bedingung auch tatsächlich ausgeführt.
Dazu lasse ich nun auch prüfen, ob der User bereits eingetragen ist. Denn Dopplungen sind ja eher hinderlich als übersichtlich.
Und zuletzt habe ich die Feldlänge auf 16,7 Mio. Zeichen hochgesetzt. TEXT-Felder sind hierfür etwas zu klein...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Re: Werte addieren

Beitrag von Holger »

Ujujujuj! Danke!

*runterlad_und_studier*

:respect:
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Antworten