Antworten auf deine Fragen:
Neues Thema erstellen

MySQL - SQL UPDATE funktioniert nicht

d3mueller

PC-Freak :D

Hallo,

Also ich habe eine Datenbank verbindung aufgebaut:

PHP:
<?php
 
error_reporting(E_ALL);
ini_set('display_errors', 1);

$db = @new MySQLi('localhost', 'root', '', 'Medep');
if (mySQLi_connect_errno()) {
    die('in news.php: Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
}
?>

Dann wolte ich in einem Formular die aktuellen Daten in der Tabelle ausgeben, das man sie ändern kann. soweit funktioniert das auch. Aber wenn ich auf absenden klicke, lädt er neu, aber es passiert nichts. Er hat den Inhalt nicht geändert. Das ist komisch:

HTML:
<?php
if(isset($_POST['submit'])) {
	$titel = $_POST['titel'];
	$inhalt = $_POST['inhalt'];
	$db->query("UPDATE `rp` SET `titel`=$titel, `inhalt`=$inhalt WHERE `id`=1");
	
}

@$tabelle = $_GET['tabellenname'];
$result = $db->query("SELECT * FROM $tabelle");
$row = $result->fetch_assoc();


?>

<fieldset class="update">
<legend>Bitte &auml;ndern sie die Informationen</legend>
<form class="einloggen" action="" method="post">
<table>
<tr>
<td width="120">Titel</td> <td><input type="text" name="titel" id="titel" value="<?php echo $row['titel'] ?>"/></td>
</tr>
<tr>
<td>Inahlt</td> <td><textarea style="width: 100%;" name="inhalt" id="inhalt"><?php echo $row['inhalt'] ?></textarea></td>
</tr>
<tr>
<td>&nbsp;</td><td><input class="button" type="submit" name="submit" value="Abschicken"/></td>
</tr>
   <tr>
<td>&nbsp;</td><td><input class="button" type="reset" name="reset" value="Reset"/></td>
</tr>
</table>
</form>
</fieldset>

Dazu muss ich noch sagen, das ich das so machen will:
update.php?tabellenname=ersteSeite
Das man mit nur einer Seite und einem Formular, alle Seiten bearbeiten kann, jenachdem welchen Link man aufruft. Das spart viel Arbeit, wenn es klappen würde.
Aber warum trägt er nichts in die Tabelle ein?
Danke schon mal

LG
Dennis
 

TobiKo

Nicht mehr ganz neu hier

AW: MySQL - SQL UPDATE funktioniert nicht

Ich hab nur kurz drüber geschaut aber vielleicht liegt es an dem `id`=1, weil die 1 als true gewertet werden könnte. Probiers einfach mal schnell mit '1'.
Und zur Sicherheit würde ich noch HTML-Tags raus filtern und mysql_real_escape_string() benutzen.

Gruß Tobi
 

Duddle

Posting-Frequenz: 14µHz

AW: MySQL - SQL UPDATE funktioniert nicht

Lass dir die UPDATE-Anfrage vor dem Abschicken ausgeben, dann führe das manuell in phpMyAdmin (oder deine Lieblings-Konsole) aus. Dann siehst du den Fehler.
Alternative kannst du auch ne Fehlerausgabe einbauen.



Duddle
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

Ich hab nur kurz drüber geschaut aber vielleicht liegt es an dem `id`=1, weil die 1 als true gewertet werden könnte. Probiers einfach mal schnell mit '1'.
Und zur Sicherheit würde ich noch HTML-Tags raus filtern und mysql_real_escape_string() benutzen.

Gruß Tobi
Danke, hab es korriegiert, musste es nur auch bei $titel und $inhalt machen, dann gings^^

mit mysql_real_escape_string():
Ja, das mache ich. Wollte nur erst mal das Grundskript haben.
Funktioniert das auch, wenn man erst mit MySQLi arbeitet? Weil es heißt ja MySQL_real_....

// EDIT:
Soll ich das auch noch machen, wenn ich den TinyMCE-Editor benutze? weil mit diesem Formular soll man den Html-Inhalt der Seite ändern können. un da brauche ich ja HTML im übertragenen Code.
Und noch ne Frage: Gibt es möglichkeiten das dennoch relativ sicher zu machen?
Oder ist das schon sicher, wenn ich ein sicheres Login-System habe, mit verschlüsselten Einlogdaten?



Lass dir die UPDATE-Anfrage vor dem Abschicken ausgeben, dann führe das manuell in phpMyAdmin (oder deine Lieblings-Konsole) aus. Dann siehst du den Fehler.
Alternative kannst du auch ne Fehlerausgabe einbauen.
Duddle
Danke für die Idee :D. ES lag daran, dass ich um die $titel und $inhalt - Variablen keine ' gemacht hab.

Lg
Dennis
 
Zuletzt bearbeitet:

TobiKo

Nicht mehr ganz neu hier

AW: MySQL - SQL UPDATE funktioniert nicht

mit mysql_real_escape_string():
Ja, das mache ich. Wollte nur erst mal das Grundskript haben.
Funktioniert das auch, wenn man erst mit MySQLi arbeitet? Weil es heißt ja MySQL_real_....

Die Funktion sollte auch mit mysqli klappen, wenn nicht wirds schon ne Fehlermeldung geben.

// EDIT:
Soll ich das auch noch machen, wenn ich den TinyMCE-Editor benutze? weil mit diesem Formular soll man den Html-Inhalt der Seite ändern können. un da brauche ich ja HTML im übertragenen Code.

Mit TinyMCE kenne ich mich wirklich nicht aus, sorry. Musst halt mal über die Sicherheit davon googeln.

Und noch ne Frage: Gibt es möglichkeiten das dennoch relativ sicher zu machen?
Oder ist das schon sicher, wenn ich ein sicheres Login-System habe, mit verschlüsselten Einlogdaten?

Ein Login-System bringt ja nicht wirklich viel für die Sicherheit, da auch eingeloggte User so ein Quatsch wie SQL-Injections und so machen können. Entweder du benutzt ein Framework oder Klasse, die dir die Sicherheitsstandards schon einbaut, oder du musst wirklich bei jeder Eingabe überprüfen, ob doch nicht Schadcode eingeflößt werden sollte.
Bei Inputs mit einem Integer-Value empfiehlt sich in den Code z.B.
PHP:
$zahl = (int)$_POST['zahl'];
zu schreiben, da so schon verhindert wird dass ein ' das macht, was er nicht soll. Natürlich musst du auch mysql_real_escape_string() bei jeder Variable benutzen, die du in die Datenbank schreibst.
PHP:
query("UPDATE `rp` SET `titel`='" . mysql_real_escape_string($titel) . "', `inhalt`='" . mysql_real_escape_string($inhalt) . "' WHERE `id`=1");
wäre ein Beispiel.

Gruß Tobi
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

Hi, danke für die antwort
habe grad mal gegooglet. Für Sicherheit soll man anscheinend htmlspecialchars() benutzen. Werde ich gleich mal ausprobieren. Hoffe, das verändert nicht so <b> und <a> Tags.

Mit dem Login-System:
Naja, es ist ja nur ein Benutzer vorhanden, nämlich der admin. Mehr wird es auch nicht geben. Das ist nur für jemanden, der nicht weiß, wie man programmiert, das er das einfach über ein Interface machen kann.

Das mit dem Integer ist auch eine gute Idee. Ich habe aber momentan kein Zahlenfeld, aber werd das dann so machen, wenn ich eins brauche. Danke

EDIT:
Habe es so gemacht:
Code:
	$titel = htmlspecialchars($_POST['titel']);
	$inhalt = htmlspecialchars($_POST['inhalt']);
	$id = (int)$_GET['id'];
Und danach kommt der SQL UPDATE-Befehl
So sollte es ja gehen. Und der TinyMCE funktioniert auch noch, so wie es aussieht.

Eine Frage noch:
Ich habe ja, wie oben bereits geschrieben, es so gemacht, dass man in der der URL einiges angibt, also : bla.php?tabellenname=irgendwas&id=1.
Und dann prüfe ich ja mit $_GET['tabellenname'] was in der URL steht. Und damit rufe ich dann datenbankinformationen auf. soll ich die auch mit htmlspecialchars() entschärfen? Oder eignet sich da eher htmlentities(), weil das ja wirklich alles an HTML umwandelt.

Oder dann doch mysql_real_escape_string()??
was sagst du?


EDIT2:
Sry, wird unübersichtlich^^.
Problem:
Wenn ich jetzt auf die Seite gehe, die die eingegebnen daten der datenbank ausgibt, dann sieht man nur den HTML-Code.
Das ist blöd :(

EDIT3:
xD
Ok, habe htmlentities() durch mysql_real_escape_string() ersetzt, und jetzt geht beides, so wie es aussieht.
Soll ich das auch bei den ?tabellenname=irgendwas machen?
 
Zuletzt bearbeitet:

TobiKo

Nicht mehr ganz neu hier

AW: MySQL - SQL UPDATE funktioniert nicht

Was wird denn mit dem Tabellennamen im Code gemacht? Ich kanns grad nicht testen,.sitze im Wartezimmer meines lieben Zahnarztes. Gruß Tobi
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

du Armer. Ich hasse Zahnarzt :D

Der Tabellenname wird mit $_GET['tabellenname'] abgerufen, da der ja in der URL steht.

Und dann kommt der Teil
Code:
$tabelle = $_GET['tabellenname'];
$id = $_GET['id'];
$result = $db->query("SELECT * FROM $tabelle WHERE id='$id'");
Da wird dann je nachdem, was als tabellenname angegeben ist, eine Tabelle ausgelesen.
Und da man ja beliebige Sachen in die URL schreiben kann, sollte man das doch auch entschärfen, oder?
 

Robbyn-

PHP / Flex Programmierer

AW: MySQL - SQL UPDATE funktioniert nicht

$tabelle = $_GET['tabellenname'];
$id = $_GET['id'];
$result = $db->query("SELECT * FROM $tabelle WHERE id='$id'");

Das schreit ja geradezu nach einer SQL-Injection, vorher alle Daten die per _GET oder _POST reinkommen überprüfen. Niemals ohne überprüfung in eine Datenbank Abfrage reinschreiben.

Man sollte irgendwo eine Liste haben wo alle Tabellen namen aufgelistet sind und überprüfen ob die angegebene Tabelle auch auf dieser Liste steht, dann sollte man damit im deut besser fahren ;)
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

^^ ja frage ist, welche entschärfungsmethode? mysql_real_escape_string()?

Mit der Liste: Ja, das könnte ich mal versuchen. Wo soll die Liste dann hin? In eine andere Datei, oder in eine Datenbanktabelle.
Und wie überprüfe ich dann, ob der tabellenname in einer Liste steht?
 

Robbyn-

PHP / Flex Programmierer

AW: MySQL - SQL UPDATE funktioniert nicht

ja frage ist, welche entschärfungsmethode? mysql_real_escape_string()?
Nein das geht nicht.

Die Liste könnte wie folgt aussehen:
PHP:
<?php
$MyList	=	array("tabelle1","tabelle2","tabelle3","tabelle4");

$tabelle = $_GET['tabelle'];

if(array_key_exists($MyList,$tabelle)) //Überprüft ob der tabellenname im array vorkommt
{
	//Wenn vorhanden dann SQL Abfrage ausführen
}
?>

Die Tabellenliste würde ich auch irgendwo gobal definieren damit ich von überall darauf zugriff bekomme und nicht immer neu definieren muss.
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

Danke, aber ich habe das jetzt mal so gemacht.
Aber es funktioniert nicht.

Code:
<?php
if(isset($_GET['tabellenname'])) {
$MyList    =    array("tabelle1","tabelle2","tabelle3","tabelle4");

$tabelle = $_GET['tabellenname'];

if(array_key_exists($tabelle,$MyList)) //Überprüft ob der tabellenname im array vorkommt
{
    if(isset($_GET['id'])) {
	$id = $_GET['id'];
} else {
	echo "Die ID fehlt!";
}
@$result = $db->query("SELECT * FROM $tabelle WHERE id='$id'");
if($result) {
$row = $result->fetch_assoc();
} else {
	$row['titel'] = "nicht Verf&uuml;gbar";
	$row['inhalt'] = "nicht Verf&uuml;gbar";
	echo "<fieldset class=\"fehler\">Es wurde keine zu &auml;ndernde Datei angegeben. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
	$file_does_not_exist = true;
}

} else {
	$row['titel'] = "nicht Verf&uuml;gbar";
	$row['inhalt'] = "nicht Verf&uuml;gbar";
	echo "<fieldset class=\"fehler\">Die Datei, die Sie &auml;ndern m&ouml;chten, existiert nicht. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
	$file_does_not_exist = true;
}
}

Damit funktioniert es nicht.
Ich hab in der URL oben ?tabellenname=tabelle1&id=1
Die Tabelle existiert und auch eine Spalte mit der Id 1

Aber es kommt nur die Fehlermleldung:
Die Datei, die Sie ändern möchten, existiert nicht. Zurück zum Menü.
 

TobiKo

Nicht mehr ganz neu hier

AW: MySQL - SQL UPDATE funktioniert nicht

Ich hab Grad auf PHP.Net array_key_exists nachgeschlagen und das bezieht sich auf den key des arrays. $MyList[key] = "tabelle1"; daran wird's wohl liegen..

Gruß Tobi

Edit: nimm in_array(), das sollte funktionieren.
 
Zuletzt bearbeitet:

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

Danke ich probiers grad mal


EDIT:
Ne, es ist kein unterschied :(

EDIT2:
Ah, hab mich verschrieben. Scheint jetzt zu funktionieren :D. Muss nochmal alles testen

Danke
 
Zuletzt bearbeitet:

TobiKo

Nicht mehr ganz neu hier

AW: MySQL - SQL UPDATE funktioniert nicht

Bitte, mach ich doch gerne :) Bei weiteren Fragen einfach nochmal schreiben.
Gruß Tobi
 

Robbyn-

PHP / Flex Programmierer

AW: MySQL - SQL UPDATE funktioniert nicht

if($result) {
$row = $result->fetch_assoc();
} else {
$row['titel'] = "nicht Verf&uuml;gbar";
$row['inhalt'] = "nicht Verf&uuml;gbar";
echo "<fieldset class=\"fehler\">Es wurde keine zu &auml;ndernde Datei angegeben. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
$file_does_not_exist = true;
}

} else {
$row['titel'] = "nicht Verf&uuml;gbar";
$row['inhalt'] = "nicht Verf&uuml;gbar";
echo "<fieldset class=\"fehler\">Die Datei, die Sie &auml;ndern m&ouml;chten, existiert nicht. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
$file_does_not_exist = true;
}

Hast du da wirklich zweimal else drin stehen?
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

Ja, aber das zweite else ist für die if-Struktur weiter oben.
Zwischen den beiden else sind ja noch 2 }

PS:
Ist das so jetzt alles in Ordnung?(Das array werde ich noch global machen, wenn das skript erst mal richtig funktioniert) :
Code:
<?php
	$file_does_not_exist = false;




if(isset($_POST['submit'])) {
	$titel = mysql_real_escape_string($_POST['titel']);
	$inhalt = mysql_real_escape_string($_POST['inhalt']);
	$id = (int)$_GET['id'];
	$tabellenname = $_GET['tabellenname'];
	if($_GET['tabellenname'] != "people") {
	$eintragen = $db->query("UPDATE `$tabellenname` SET `titel`='$titel', `inhalt`='$inhalt' WHERE `id`='$id'");
	} else {
	$eintragen = $db->query("UPDATE `$tabellename` SET `inhalt`='$inhalt' WHERE `id`='$id'");	
	}
	if( ! $eintragen) {
		echo "<fieldset class=\"fehler\">Es gab einen Fehler. Bitte versuchen Sie es sp&auml;ter erneut, oder kontakieren Sie einen Systemadministrator.</fieldset>";
	} else {
		echo "<fieldset class=\"erfolg\">Die Datei wurde erfolgreich ge&auml;ndert.<br><br><a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a></fieldset>";
	}
	
}


if(isset($_GET['tabellenname'])) {
$MyList    =    array("rp","projects","people");

$tabelle = $_GET['tabellenname'];

if(in_array($tabelle,$MyList)) //Überprüft ob der tabellenname im array vorkommt
{
    if(isset($_GET['id'])) {
	$id = $_GET['id'];
} else {
	echo "<fieldset class=\"fehler\">Die ID fehlt! <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
}
@$result = $db->query("SELECT * FROM $tabelle WHERE id='$id'");
if($result) {
$row = $result->fetch_assoc();
} else {
	$row['titel'] = "nicht Verf&uuml;gbar";
	$row['inhalt'] = "nicht Verf&uuml;gbar";
	echo "<fieldset class=\"fehler\">Es wurde keine zu &auml;ndernde Datei angegeben oder die Datei existiert nicht. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
	$file_does_not_exist = true;
}

} else {
	$row['titel'] = "nicht Verf&uuml;gbar";
	$row['inhalt'] = "nicht Verf&uuml;gbar";
	echo "<fieldset class=\"fehler\">Die Datei, die Sie &auml;ndern m&ouml;chten, existiert nicht. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
	$file_does_not_exist = true;
}
}

if(!isset($_GET['tabellenname'])) {
	echo "<fieldset class=\"fehler\">Es wurde keine zu &auml;ndernde Datei angegeben. <a href='menu.php'>Zur&uuml;ck zum Men&uuml;</a>.</fieldset>";
}
?>

Weil an diser Stelle
Code:
$tabellenname = $_GET['tabellenname'];
	if($_GET['tabellenname'] != "people") {
	$eintragen = $db->query("UPDATE `$tabellenname` SET `titel`='$titel', `inhalt`='$inhalt' WHERE `id`='$id'");
	} else {
Packe ich ja direkt, ohne iwas zu überprüfen den Wert von $_GET in eine sql Anweisung.
Aber das ist in dem Fall ja nicht schlimm, oder? Weil der if-Zweig tritt ja nur in Kraft, wenn man auf Submit klickt. Außerdem ist da drunter ja ein Skript, das alles entschärft.
Das Problem ist, wenn ich das mit dem entschärfen über das andere packe, dann liest er erst den alten Inhalt aus(und schreibt sie dann in die Formularfelder) und dann erst ändert er den Inhalt. Dann muss man jedes mal neu laden. Gibt es da eine andere Möglichkeit?

Ich hoffe, ihr versteht, was ich meine
 

Robbyn-

PHP / Flex Programmierer

AW: MySQL - SQL UPDATE funktioniert nicht

$titel = mysql_real_escape_string($_POST['titel']);
$inhalt = mysql_real_escape_string($_POST['inhalt']);

Falsch, die Zuweisung von mysql_real_escape_string muss in der SQL Abfrage stattfinden:

PHP:
$query = "SELECT `id` FROM `tabelle1` WHERE username = 'mysql_real_escape_string($username)'";

Als Beispiel.

Ansonsten ist das andere alles ok :)

Noch eins, ich würde die Tabellennamen nicht per _GET übertragen und falls doch dann benutze ein Pseudonym. Beispiel:

?table=table1&id=1

PHP:
$myArray = array(
'table1' => "users_table",
'table2' => "topic_table"
);

$table = $_GET['table'];

if(!empty($myArray[$table])) //Wenn vorhanden, dann weiter
{
  $myTable = $myArray[$table];
}
 

d3mueller

PC-Freak :D

AW: MySQL - SQL UPDATE funktioniert nicht

Okay das mit dem mysql_real_escape_string werd ich gleich mal ändern, danke.

Bloß, wie kann man noch mit einem einfach Link Dinge übertragen? Mit POST geht das doch nur übers Formular, und ich wollte halt nicht jedes mal ein formular machen, sondern einfach einen Link, den man bei bedarf auch schnell mal anpassen kann.

Mit dem Pseudonym.
Kann ich mal versuchen.
Wenn ich das so machen würde, müsste ich ja diese Zeilen hier ersetzen, oder?
Code:
if(isset($_GET['tabellenname'])) {
$MyList    =    array("rp","projects","people");

$tabelle = $_GET['tabellenname'];

if(in_array($tabelle,$MyList)) //Überprüft ob der tabellenname im array vorkommt
{
.. //Dann kommt der Code für das Auslesen der Inhalte etc.
}
Wobei die erste Zeile da (also if(isset($_GET['tabellenname'])) {) sollte ja eigentlich da bleiben, weil, wenn dann jemand ohne so einen Link drauf kommt, dann kommen bestimmt wieder Fehlermeldungen.
 

Duddle

Posting-Frequenz: 14µHz

AW: MySQL - SQL UPDATE funktioniert nicht

Falsch, die Zuweisung von mysql_real_escape_string muss in der SQL Abfrage stattfinden:

Blödsinn. mysql_real_escape_string() ist eine PHP-Funktion. Nur weil es oft direkt in der SQL-Anfrage geschrieben wird, muss es dort nicht sein. Folgende drei Code-Auszüge sind semantisch gleich:
PHP:
$foo = mysql_real_escape_string($foo);
$sql = "SELECT * from `bar` WHERE xyz = '".$foo."'";
mysql_query($sql);
PHP:
$foo = mysql_real_escape_string($foo);
mysql_query("SELECT * from `bar` WHERE xyz = '".$foo."'");
PHP:
mysql_query("SELECT * from `bar` WHERE xyz = '".mysql_real_escape_string($foo)."'");


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.616
Beiträge
1.538.359
Mitglieder
67.535
Neuestes Mitglied
QuestionMark
Oben