• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP] php Anfänger sucht Hife

reinhhardp

New member
Grüß Euch,

Ich habe folgendes Problem:

mittel $_POST bekomme ich eine variable Anzahl an Daten an ein php Script übermittelt.

Wie kann ich nun diese Daten in ein SQL Statment verwandeln?

Das SQL Statement soll dann so aussehen:
Code:
UPDATE  `collection`.`articles` SET  `Name` =  'Ball for the dog1',`shelf` =  'PP_1521' WHERE  `articles`.`id` =1 LIMIT 1 ;


im Netz nab ich leider dazu nichts gefunden.
Da steht nur $_POST['blabla'], aber nichts wie ich $_POST dynamisch verarbeiten kann.

Danke,
Reinhard
 
Zuletzt bearbeitet:
Hi,

im allgemeinen sehen die Übertragungen gleich aus.

Bei $_GET werden in dem Link die Übertragungen sichtbar dargestellt.
PHP:
index.php?x=1&y=Hallo

Bei $_POST ist es nicht wirklich anders außer, das man im Link nichts sieht und die Überträge direkt an die entsprechende Datei geleitet werden. OK, die Technik ist bissel anders aber das spielt hier jetzt keine Rolle. :)

Nichts desto trotz werden diese aber, wie bei $_GET abgerufen.

In deinem Beispiel müssten dann halt alle Überträge einzeln abgerufen werden.
PHP:
$name = $_POST["name"];
$self = $_POST["self"];
$id = $_POST["id"];

$update = mysql_query( UPDATE articles SET name = $name, shelf = $self WHERE id = $id );
Natürlich musst du auch die ID des zu bearbeiteten Artikel mitsenden.
LIMIT = 1 brauchst du da auch dann nicht wirklich, da die ID einmalig sein sollte. Entweder mittels AUTO_INCREMENT oder UNIQUE in der SQL Struktur.

Gruß,
Terra
 
Zuletzt bearbeitet:
@terra: du hast jetzt nicht wirklich ein 100%ig (und zwar gleich dreifach) für https://de.wikipedia.org/wiki/SQL-Injection anfälligen Code gepostet...

@reinhardp: Mit PDO geht das schöner und sicher:
PHP:
$pdo = new PDO(...);

$stmt = $pdo->prepare("UPDATE `articles` SET `name` = :name, `shelf` = :shelf WHERE id = :id");
$stmt->execute(
	":name" => $_GET["name"],
	":shelf" => $_GET["shelf"],
	":id" => $_GET["id"]
);
 
Es war ja jetzt nur ein einfaches Beispiel um die Funktionsweise zu verstehen. Von Injection war ja gar nicht die Rede. :)
Wer es noch nicht versteht, mit GET und POST zu arbeiten, den wird mysql_real_escape_string u.s.w. nur noch mehr irritieren.

Gruß,
Terra
 
Zuletzt bearbeitet:
Braucht man nicht? Das wäre mir neu.
Wie würdest du ohne PDO ein Injektion-Sicheren Eintrag in MySQL machen?

Es spricht sicher nichts gegen PDO aber so ziemlich jeder, der anfängt mit PHP zu programmieren, wird am Anfang auf die klassischen MySQL Befehle zurückgreifen, da es überall so beschrieben ist.

Gruß,
Terra
 
Ja, das sind die scheiß Gewohnheiten, die man sich im laufe der Jahre aneignet. :grin:
Aber lerne auch gerne immer was neues dazu.

Terra
 
...aber so ziemlich jeder, der anfängt mit PHP zu programmieren, wird am Anfang auf die klassischen MySQL Befehle zurückgreifen, da es überall so beschrieben ist.

Ich gehe sogar soweit, jeder Anfänger soll sich gleich mit PDO beschäftigen und die klassischen MySQL Befehle schon mal zum Müll geben.
 
Mein Script sieht nun so aus:

Code:
<?php
error_reporting(E_ALL | E_STRICT);
$id = $_GET['filter'];
$object = $_POST;
	$link = mysql_connect("localhost", "reinhardp", "4reinhard4") or die("Keine Verbindung möglich: " . mysql_error());
	mysql_select_db("collection") or die("Auswahl der Datenbank fehlgeschlagen");
$arr = array();
foreach($object as $key => $value)
{
	$temp = sprintf("'%s'='%s'",$key,$value);
	array_push($arr,$temp);
}
$str = implode(",",$arr);
$update = sprintf("UPDATE 'articles' SET %s WHERE 'id'='%s'",$str,$id);
$result = mysql_query($update) or die("Anfrage fehlgeschlagen: " . mysql_error());
echo $update;
mysql_close($link);
?>

Nur da bekomme ich einen SQL Syntaxfehler. Kann mir bitte jemand sagen was ich da falsch mache?

Danke,
Reinhard

P.S: Sorry, die relevante Zeile hatte ich versehentlich gelöscht.

Es ist die: $result = mysql_query($update) or die("Anfrage fehlgeschlagen: " . mysql_error());
 
Zuletzt bearbeitet:
@reihardp: Warum arbeitest du mit veralteten Funktionen wie mysql_connect ?

Warnung
Diese Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wird in der Zukunft entfernt werden.

kkapsner hat schon in #3 auf PDO hingewiesen und einen Ansatz gezeigt. PDO ist bei allen halbwegs aktuellen PHP-Installationen dabei.
 
Du verwendest die falschen Ticks für deine Spaltennamen. ' ist in SQL der Stringdelimite. Für Identifier musst du den Backtick ` (accént graph - ist die Taste neben dem "ß" mit Umschalt) verwenden.

PS: Auf die SQL-Injection-Problematik wurdest du ja schon hingewiesen...
 
Danke für den Tip mit den backticks.
Leider hat das nicht geholfen. Jetzt kommt folgende Fehlermeldung:

Anfrage fehlgeschlagen: Unknown column 'Ball for the dog1' in 'field list'.

Das SQL Statement schaut nun so aus:

"UPDATE `collection`.`articles` SET `Name` = `Ball for the dog1` WHERE `articles`.`id` =1 LIMIT 1;

"

Ich habs auch ohne ; nach LIMIT 1 versucht. Was mich stört sind die 2 CRLF nach dem ";". Ich habe keine Ahnung woher die kommen, in der PHP Datei sind sie nicht vorhanden.

Danke,
Reinhard
 
Deine Anweisung ergibt erstens keinen Sinn.

Zweitens solltest du dich bei Tabellen und Spaltenbezeichnungen auf ein Standard einigen. Also entweder alles klein schreiben, oder überall den Anfangsbuchstaben groß. Damit meine ich dein Spaltenname "Name" im Gegensatz zum Rest. So ein Mischmasch macht nur Fehler.

Drittens: Wenn du dich bereits eh in einer Tabelle befindest, brauchst du das nicht dieses im gesamten Teil der Anweisung nochmal zu wiederholen. Sprich: `articles`.`id` ergeben da auch keinen Sinn und ist auch nicht notwendig. Es müsste dann auch `articles.id` heißen. Bei Einstelligen Namen ohne Bindestrich oder so sind die Apostrophe bzw. Backticks für die Bezeichnungen nicht notwendig.

Im großen und ganzen würde folgendes ausreichen:
PHP:
UPDATE articles SET Name='Ball for the dog1' WHERE id=1 LIMIT 1

Schlussendlich kann dann deine Anweisung wie folgt aussehen:
PHP:
$update = sprintf("UPDATE articles SET Name='%s' WHERE id='%d' LIMIT 1", $name, $id);

Die ganze Sache sieht bei LEFT.JOIN Anweisungen wieder anders aus.

Und noch ein kleiner Tip, den ich immer folge. Bezeichne deine Spalten mit zusätzlich dem Tabellennamen.
Also articlesId, articlesName, articlesWhatever, ...
Das erleichtert ein späteres zuordnen von Spalten bei komplizierteren Anweisungen.


Ganz zum Schluss noch was. Setze bitte das Beispiel von kkapsner im 3. Post um. (http://forum.jswelt.de/serverseitige-programmierung/61522-php-anf-nger-sucht-hife.html#post395411)
Ich habe selbst den Fehler gemacht und noch Jahrelang mit den veralteten Techniken der Programmierung von MySQL gearbeitet. PDO ist wirklich besser und ich werde selbst meine MySQL Funktionsdatenbank auf PDO umstellen.

Gruß,
Terra
 
Zuletzt bearbeitet:
Und noch ein kleiner Tip, den ich immer folge. Bezeichne deine Spalten mit zusätzlich dem Tabellennamen.
Also articlesId, articlesName, articlesWhatever, ...
Das erleichtert ein späteres zuordnen von Spalten bei komplizierteren Anweisungen.
Finde ich jetzt umständlich. Wenn man in den Anweisungen wissen will, welche Spalte zu welcher Tabelle gehört, kann man die Tabelle ja zum Identifier dazuschreiben. Wie Reinhard das ja schon gemacht hat.
 
Zurück
Oben