...das kannst du mit dem HTML-Attribut "tabindex" beeinflussen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Tabelle für INPUT erzeugen und Daten in MySQL updaten
Einklappen
Neue Werbung 2019
Einklappen
X
-
Zitat von JoeLio Beitrag anzeigen
@VPh:
Ich sehe das richtig, dass der Zahlenwert in der eckigen Klammer hinter $row angibt, an welcher "Position" die id abgerufen wurde?
Wenn ich die Abfrage also so vornehme ...
Was ich mit der Syntax nicht hinbekommen hatte, war die Schleife. Ich hatte da mit WHILE rumprobiert. Die Lösung mit FOREACH kann ich nachvollziehen, aber ich frage mich, woher die Variable $value in deinem Code kommt und was sie bezweckt?
z.B.
PHP-Code:<html>
<form action="" method="POST">
<input type="text" name="Tier[1]"><!-- Eingabe: Hund -->
<input type="text" name="Tier[2]"><!-- Eingabe: Katze -->
<input type="submit">
</form>
</html>
PHP-Code:foreach($_POST['Tier] as $key => $value){
echo 'Tier Nummer '.$key.': '.$value.'<br/>';
}
// Tier Nummer 1: Hund
// Tier Nummer 2: Katze
In dem Beispiel vorhin habe ich $value nicht benutzt, weil ichs einheitlicher fand wenn ich für den Nachnamen auch übers Array mit den Index auf den Wert zugreif.[COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
[URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]
Kommentar
-
Zitat von rkr Beitrag anzeigen...das kannst du mit dem HTML-Attribut "tabindex" beeinflussen.
Und ich habe wieder viel dabei gelernt, als ich versucht habe, den tabindex in Abhängigkeit von der Dimension der Tabelle über entsprechende Variablen zu setzen. Ihr werdet darüber bestimmt schmunzeln, weil sowas ja tägliche Arbeit für die Profis hier ist. Aber ... ich hab's hinbekommen!
Für den Benutzer ist das später eine ERHEBLICHE Erleichterung bei der Eingabe. Der muss dann nämlich ewig lange Kolonnen einstelliger Zahlen eintippen - und wenn man da jedesmal zur Maus greifen muss, wird man bekloppt.
JoeLio
Kommentar
-
Zitat von JoeLio Beitrag anzeigenWas ist hier denn das Problem mit fetch_row?
Da sprichst du die Felder dann so an:
PHP-Code:$row['id']
$row['name']
$row['vorname']
Zitat von JoeLio Beitrag anzeigenMir ist schon klar, dass man bei der Eingabe der Werte eine Validierung vornehmen muss, aber ich weiß noch nicht, wie das geht. Kann mir jemand für die schlimmsten Dinge einen Tipp geben
Beim Escapen wird sichergestellt das Eingaben nicht die Ausführung/Darstellung beeinflussen. Ansonsten kann das einseits dazu führen das die Anwendung Daten nicht richtig verarbeitet und/oder Sicherheitsprobleme verursachen. Z.B. geb mal ein Test"test in ein Eingabefeld ein. Das führt zu einen SQL Fehler, weil der Query dann so aussieht:
PHP-Code:UPDATE tabelle SET nachname = "Test"test", vorname = ...
PHP-Code:UPDATE tabelle SET nachname = "Test\"test", vorname = ...
PHP-Code:<input type="text" value="Test"test">
PHP-Code:<input type="text" value="Test"e;test">
Auch wenn du jetzt sagst >ich will da kein "< eingeben, das interessiert später die Anwender nicht.
Kommentar
-
Moment, wieso sollte es keinen undefinierten Index geben, wenn du assoziative Arrays nimmt? Es kann ja gut sein, dass eine Spalte anders heisst als du dir das vorstellst.
Die Gefahr, ob assoziativ oder numerisch, auf einen ungültigen Index zu treffen ist gleich hoch.[URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]
Kommentar
-
Hallo erc,
danke für die Infos und Tipps! Ich lerne dazu.
Ich bleibe erstmal bei fetch_row, denn im Moment bin ich noch konzentriert genug, um richtig zu zählen. Grundsätzlich leuchten mir aber auch die Vorteile von fetch_assoc ein.
Das mit dem escapen sieht mir nach Arbeit aus. Ich habe auch noch nicht zu ganz kapiert, an welcher "Stelle" ich escapen muss. Habe ich das richtig verstanden, dass beim escapen der Benutzer grundsätzlich "falsche" Eingaben machen kann, die dann aber beim UPDATE korrigiert werden? Wenn ja, dann verstehe ich noch nicht ganz, wie. Hast du ein ausführlicheres Beispiel für mich?
Zitat von erc Beitrag anzeigenDu musst zwischen Validierung und Escapen unterscheiden. Bei der Validierung prüfst du ob die Eingaben deinen Vorstellungen entsprechen.
Also müsste ich doch einfach nur so validieren, dass der Benutzer hier eine Fehlermeldung bekommt, oder?
Kann ich nicht eine Abfrage vorschalten, die auf das Vorkommen bestimmter Zeichen prüft und den Benutzer dann anmeckert, dass er die gefälligst nicht verwenden soll?
Danke und Gruß
JoeLio
Kommentar
-
VIELEN DANK FÜR EURE HILFE! Es wird langsam ...
Mannomann, da ist aber 'ne Menge zu lernen. Macht aber Spaß!
An VPh, aber vielleicht auch die anderen Experten hier:
In deinem Post vom 12.8., 13:44, schreibst du mir folgendes FOREACH:
PHP-Code:foreach($_POST['nachname'] as $id => $value){
$sql = 'UPDATE tabelle SET nachname = "'.$_POST['nachname'][$id].'", vorname = "'.$_POST['vorname'][$id].'" WHERE ID = '.$id;
mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
Häh? Bin ich blöd? In deinem ersten Code-Beispiel steht doch aber $value ...?
PHP-Code:foreach($_POST['Tier] as $key => $value){
echo 'Tier Nummer '.$key.': '.$value.'<br/>;
}
Wahrscheinlich ist dein Beispiel einfach nur allgemein gehalten und ich bin noch nicht genug geübt, das zu kapieren ...
Ich habe dieses Update mit FOREACH jetzt jedenfalls so realisiert:
PHP-Code:foreach($_POST['id'] as $id => $value)
{
$sql = 'UPDATE tabelle SET al1 = "'.$_POST['al1'][$id].'", al2 = "'.$_POST['al2'][$id].'", al3 = "'.$_POST['al3'][$id].'",
al4 = "'.$_POST['al4'][$id].'", al5 = "'.$_POST['al5'][$id].'" WHERE id = '.$id;
mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
}
Den Teil "as $id => $value" habe ich einfach beibehalten, aber $value gibt es bei mir sonst nirgends (also ist dieser Variablen ja vermutlich Null zugewiesen). Wozu ist die da dann drin, wozu überhaupt das "as $id => ..." ???
Auch verstehe ich noch nicht, was die Hochkommata ('), Anführungszeichen (") und Punkte (.) jeweils genau bezwecken. Die kann man offensichtlich hier und da auch mal weglassen ...?
Insbesondere verwundert mich das Ende der Anweisung $sql, nämlich:
WHERE id = '.$id;
Warum steht hinter dem Gleichheitszeichen "nichts" mehr? Wird da dann die $id zugewiesen?
Irgendwie scheint mir das mit den " und den ' nicht einheitlich.
Also, mein Script funktioniert zwar, ich will das doch auch verstehen!
Könnt ihr mir nochmal auf die Sprünge helfen?
Dank & Gruß
JoeLio
Kommentar
-
PHP-Code:foreach($_POST['id'] as $id => $value)
PHP-Code:foreach( ARRAY as $KEY => $VALUE)
PHP-Code:WHERE id = '.$id;
[QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]
Kommentar
-
Hallo tkausl, hallo VPh,
die Sytax der FOREACH-Anweisung habe ich schon kapiert, aber ich verstehe nicht, wie das in dem Beipsiel von VPh funktionieren soll:
PHP-Code:<html>
<form action="" method="POST">
<input type="text" name="Tier[1]"><!-- Eingabe: Hund -->
<input type="text" name="Tier[2]"><!-- Eingabe: Katze -->
<input type="submit">
</form>
</html>
PHP-Code:foreach($_POST['Tier] as $key => $value){
echo 'Tier Nummer '.$key.': '.$value.'<br/>;
}
// Tier Nummer 1: Hund
// Tier Nummer 2: Katze
PHP-Code:<?php
if (isset($_POST['new']))
{
foreach($_POST['nachname'] as $id => $value){
$sql = 'UPDATE tabelle SET nachname = "'.$_POST['nachname'][$id].'", vorname = "'.$_POST['vorname'][$id].'" WHERE ID = '.$id;
mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
}
}
?>
Ist jemand so nett und erklärt mir, warum man hier
UPDATE tabelle SET al1 = "'.$_POST['al1'][$id].'" ...
das al1 mit Hochkommata einschließt. Die könnte man doch auch weglassen, oder?
(Dazu habe ich im Netz nichts gefunden ...)
Und mag auch nochmal jemand auf meine Frage zur Validierung, mit der man dem Escapen vorbeugen kann, in Post #22 eingehen?
Gruß & Dank
JoeLio
Kommentar
-
PHP-Code:<input type="text" name="Tier(1)[1(2)]"><!-- Eingabe: Hund(3) -->
<?php
foreach($_POST['Tier](1) as $key(2) => $value(3)){
echo 'Tier Nummer '.$key.': '.$value.'<br/>;
}
Da das Element in diesem Fall ein Array ist:
(2) = Der Index dieses Elements im Array, das dem $_POST-Array übergeben wird. Wenn man da nichts einträgt, wird das wie üblich bei 0 beginnend für jedes Element höher gezählt
(3) = Der Wert des Elements
Und vor allem ist mir nach wie vor unklar, was $value im Post #12 bewirken soll:
PHP-Code:UPDATE tabelle SET al1 = "'.$_POST['al1'][$id].'" // Der Index ist der String 'al1'
UPDATE tabelle SET al1 = "'.$_POST[al1][$id].'" // Der Index ist die Konstante al1, wurde die Konstante nicht definiert, wird es als String interpretiert, wirft aber ne notice
Und mag auch nochmal jemand auf meine Frage zur Validierung, mit der man dem Escapen vorbeugen kann, in Post #22 eingehen?[COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
[URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]
Kommentar
-
Vielen Dank für deine ausführliche Hilfe, VPh!
Ich werde mich damit heute nachmittag mal in Ruhe befassen.
Zitat von VPh Beitrag anzeigenManchmal will jemand eben ein Sonderzeichen irgendwo schreiben und speichern, ich würds nicht gut finden wenn man mir einfach Möglichkeiten klaut.
In meinem Fall geht es aber gerade darum, dass ich nur ganz bestimmte Daten erfassen will. Es sollen z.B. Zahlenwerte von 1 bis 9 eingetragen werden (und alles andere wäre sowieso Unsinn, weil es bei der späteren Verarbeitung dieser Daten Probleme machen würde). In einem solchen Fall wäre es doch sinnvoll, von vornherein über die Validierung nur diese Eingaben zu erlauben (wie eigentlich?) und dann kann ich mir das Escapen ersparen, oder?
Gruß
JoeLio
Kommentar
-
Hallo und vielen, vielen Dank für eure Hilfe bisher!
Meine Kenntnisse wachsen und meine ersten Lösungen sind auch schon da.
Ich erlaube mir mal ausnahmsweise, mich selbst zu zitieren, denn mich würde interessieren, wie ihr das seht:
Zitat von JoeLio Beitrag anzeigenIn meinem Fall geht es aber gerade darum, dass ich nur ganz bestimmte Daten erfassen will. Es sollen z.B. Zahlenwerte von 1 bis 9 eingetragen werden (und alles andere wäre sowieso Unsinn, weil es bei der späteren Verarbeitung dieser Daten Probleme machen würde). In einem solchen Fall wäre es doch sinnvoll, von vornherein über die Validierung nur diese Eingaben zu erlauben (wie eigentlich?) und dann kann ich mir das Escapen ersparen, oder?
Ich würde gern wissen, wie ihr meinen oben geschilderten Fall einschätzt und freue mich über Antworten dazu. (Oder gehört das nicht mehr unter "Datenbanken"?)
Gruß
JoeLio
Kommentar
-
Ich bleib dabei, benutz durchgehend Prepared Statements, dann kann dir escaping egal sein und die Frage erübrigt sich.
Ansonsten, User-Input immer escapen -> Nr.sicher[COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
[URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]
Kommentar
-
Hi JoeLio,
vielleicht noch als Anmerkung/Ergänzung:
Um bei einer großen Tabelle nicht alle Datensätze (Tabellenzeilen) aktualisieren zu müssen, sondern nur die, die in der Tabelle geändert wurden,
kannst du den Datensätzen in der Tabelle noch ein CheckboxArray "spendieren":
PHP-Code:<?php
error_reporting (E_ALL);
ini_set ('display_errors', true);
$conn = new PDO("mysql:host=localhost;dbname=test", "guenni", "guenni");
/*
* Tabelle abfragen
*/
$query = "select id, vorname, nachname from tabelle2 order by nachname";
$stmt = $conn->prepare($query);
/*
* $stmt->execute() gibt true bei Erfolg, false bei Mißerfolg zurück
*/
$ok = $stmt->execute();
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Update Tabelle</title>
</head>
<body>
<?php
/*
* Enthält $ok false, Fehlerarray ausgeben
*/
if($ok !== true){
echo "<pre>";
print_r($stmt->errorInfo());
/*
* Ansonsten Tabelle mit den Daten ausgeben
*/
}else{?>
<form action="update_tabelle.php" method="post">
<table border = "1">
<tr>
<th>Vorname</th><th>Nachname</th><th>Edit</th>
</tr>
<?php
while($data = $stmt->fetch(PDO::FETCH_ASSOC)){
echo "<tr>";
echo "<td><input type = \"text\" name = \"vorname[".$data['id']."]\" value = ".$data['vorname']."></td>";
echo "<td><input type = \"text\" name = \"nachname[".$data['id']."]\" value = ".$data['nachname']."></td>";
/*
* An jede Zeile eine Checkbox anhängen, um Datensätze auszuwählen
*/
echo "<td><input type = \"checkbox\" name = \"edit[".$data['id']."]\" value = ".$data['id']."></td>";
echo "</tr>";
}
?>
<tr>
<td colspan="3">
<input type="submit" name="cmd" value="Update">
</td>
</tr>
</table>
</form>
<?php }
?>
</body>
</html>
PHP-Code:<?php
error_reporting (E_ALL);
ini_set ('display_errors', true);
$conn = new PDO("mysql:host=localhost;dbname=test", "guenni", "guenni");
if(!isset($_POST['edit'])){
echo "Es wurden keine Datensätze zum Ändern gesendet.";
echo "<a href=\"javascript:history.back()\"> Zurück </a>";
exit;
}
/*
* Prepared Statement mit Platzhalter
*/
$query = "update tabelle2 set vorname = ?, nachname = ? where id = ?";
$stmt = $conn->prepare($query);
/*
* Jeden Datensatz, dessen Checkbox angewählt ist, aktualisieren
*/
foreach($_POST['edit'] as $id){
$stmt->execute(array($_POST['vorname'][$id], $_POST['nachname'][$id], $id));
}
header("location: edit-user2.php");
exit;
Gruß
Günni
Kommentar
Kommentar