Seite 1 von 1

Werte addieren

Verfasst: Di 05.Jul, 2011 10:56
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

Re: Werte addieren

Verfasst: Di 05.Jul, 2011 20:16
von oxpus
Leider bekomme ich eine Fehlermeldung.
Und welche?

Re: Werte addieren

Verfasst: Mi 06.Jul, 2011 09:29
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.

Re: Werte addieren

Verfasst: Mi 06.Jul, 2011 11:57
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 = " ;)

Re: Werte addieren

Verfasst: Mi 06.Jul, 2011 13:23
von Holger
:wall: :D

Ich versuche es! Danke!

Re: Werte addieren

Verfasst: Mi 30.Nov, 2011 11:06
von Holger
Mist! Ich komme nicht voran! :wall:

Muss ich in der Form auch die ID mitschicken?

Re: Werte addieren

Verfasst: Mi 30.Nov, 2011 17:55
von oxpus
Was soll denn die $id darstellen?

Re: Werte addieren

Verfasst: Do 01.Dez, 2011 09:18
von Holger
Die id des aktuellen Eintrages ^1

Re: Werte addieren

Verfasst: Do 01.Dez, 2011 20:27
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.

Re: Werte addieren

Verfasst: Fr 02.Dez, 2011 09:00
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 ...

Re: Werte addieren

Verfasst: Fr 02.Dez, 2011 19:42
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;

Re: Werte addieren

Verfasst: Sa 03.Dez, 2011 11:34
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!";
	}

Re: Werte addieren

Verfasst: Sa 03.Dez, 2011 11:35
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?

Re: Werte addieren

Verfasst: Sa 03.Dez, 2011 17:43
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...).

Re: Werte addieren

Verfasst: Sa 03.Dez, 2011 19:29
von Holger
Oha! Danke für die ausführliche Erklärung!
Ich werde dies jetzt mal testen!

Re: Werte addieren

Verfasst: Di 06.Dez, 2011 12:03
von Holger
Leere weisse Seite :-(

Re: Werte addieren

Verfasst: Di 06.Dez, 2011 15:33
von oxpus
Leer bereits beim Aufruf oder nach dem Absenden des Formulars?

Re: Werte addieren

Verfasst: Di 06.Dez, 2011 15:40
von Holger
Leer bereits beim Aufrufen ...

Re: Werte addieren

Verfasst: Di 06.Dez, 2011 19:24
von oxpus
Kannst du mir mal das gesamte Script zukommen lassen?
Ich kann so erst einmal keinen Fehler finden.

Re: Werte addieren

Verfasst: Di 06.Dez, 2011 19:30
von Holger
Skicke ich Dir gerne morgen!
Ansonsten liegt es im Ordner /mat/

Re: Werte addieren

Verfasst: Di 06.Dez, 2011 23:37
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.

Re: Werte addieren

Verfasst: Mi 07.Dez, 2011 15:30
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!

Re: Werte addieren

Verfasst: Mi 07.Dez, 2011 17:01
von Holger
Hm, irgendwie bekomme ich das trotzdem nicht hin.
Im wasthere-Feld wird nichts gespeichert ...
Ich bin echt zu blöd!

Re: Werte addieren

Verfasst: Mi 07.Dez, 2011 19:58
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...

Re: Werte addieren

Verfasst: Mo 12.Dez, 2011 09:40
von Holger
Ujujujuj! Danke!

*runterlad_und_studier*

:respect: