Antworten auf deine Fragen:
Neues Thema erstellen

Ein PHP-Formular - mehrere mySQL-Datensätze

Phips_CH

Noch nicht viel geschrieben

Hallo Curanai
Das ist so. ich hab php und mySQL hauptsächlich durch Dreamweaver kennengelernt. Und das auch mehr oder weniger im Selbststudium. Die Grundlegenden Funktionen sind da auch für mich verständlich und auch nachvollziehbar.
Aber wenn es dann spezieller wird, dann steh ich schnell mal an. Wie im aktuellen Fall.

Gruss
Phips_CH
 

Curanai

Aktives Mitglied

Hey Phips, mach Dir keinen Kopf - ich will nicht stänkern o. ä. Aber manchmal darf - und muss - man darauf hinweisen, dass WYSIWYG irgendwann eine Sackgasse ist.

Aaaalso ... um es Dir nicht gannnnnz so einfach zu machen (hehe) und auch ein Lerneffekt bei Dir auftritt - zeige mir bitte (Text oder Screenshot) die Felder, die Du im INSERT füttern willst. Hierzu wünsche ich mir eine "Struktur"-Ansicht (sprich: da steht der Datentyp). Was benutzt Du, um Deine Datenbank zu "bedienen"? phpMyAdmin oder mein stark bevorzugtes und immer wieder positiv erwähntes HeidiSQL (weil klasse)?

Ich helfe Dir gern weiter - nur mag ich jetzt nix mehr Vorkauen, sondern zeige Dir den Aha-Effekt am eigenen Leib (= eigenem Beispiel). :D

Felder, die nicht nötig sind, kannst Du ausblenden/schwärzen/whatever. Also nur die Felder, die oben in Deinem noch falschen INSERT stehen ... Strukturansicht ... dann geht's (von meiner Seite aus) weiter.

Alternativ: Kurzes Skype-Meeting mit Bildübertragung Deinerseits - und möglichst ohne Dialekt. :D (denn da komme ich nicht mit)

Lass von Dir hören ...
 

Phips_CH

Noch nicht viel geschrieben

Schoneimal vielen Dank für Deine Unterstützung.

Hier der Screenshot meiner DB-Struktur (ich hoffe Du hast das gemeint).
Die Tabelle heisst "saer_podidate".
23-07-201412-39-424ps54.jpg

Gruss
Phips_CH
 
Zuletzt bearbeitet:

Curanai

Aktives Mitglied

Die Links von unserem afr0 sind gut - und ich gehe da klar konform, dass Du Dich damit wirklich beschäftigen solltest. Zu Deinem Screenshot ...

Machen wir einen Ausflug in das Feld der Datentype:

INT(500) ... ein Integer (Ganzzahl) liegt - mit Vorzeichen - im Bereich -2147483648 bis 2147483647. Setzt Du die Spalte optional auf "unsigned", könnte diese von 0 bis +4294967295 gehen. Deine Angabe mit (500) entspricht daher nicht den Gegegenheiten, da Integer nur ein INT(10) (egal ob "signed" oder "unsigned") könnte.

VARCHAR(500) ... das klappt - keine Bange. VARCHAR kann bis zu 65,535 Zeichen speichern. ABER ... utf-8 (gute Wahl!) erfordert u. U. bis zu drei Bytes pro Zeichen. Im Extremfall kannst Du also nur 21,844 Zeichen darin speichern (!). Bei Deiner "500" lassen sich mit dieser Berücksichtigung u. U. nur ~ 165 Zeichen speichern. Unter Umständen - schon wieder - solltest Du auf den nächsthöheren Datentyp für Strings wechseln.

DATE ... MySQL unterstützt hier 1000-01-01 bis 9999-12-31 ... gespeichert wird hier als 'YYYY-MM-DD'. Gleiches gilt für TIME (als HH:MM:SS) ...

Soooo ... und je nach Ankunft aus Deinem POST, wirst Du dem INSERT was aufbereiten müssen, damit die Datentypen mit dem POST auch passen. Gibst Du also in Deine Maske für die Uhrzeit ein "13:45" (normale MEZ-Uhrzeit) an, so wirst Du das dort nicht für DATE abgelegt bekommen; Du wirst "13:45:00" draus machen dürfen (ich glaube, dass MySQL da zimperlich war). Und die Quotes darum haben auch ihre Berechtigung.

Ich für meinen Teil vergebe an Zahlen (Integer, Float, Decimals etc.) keine Quotes. Alles, was String, Date, Time etc. ist, bekommt von mir Quotes (Single/Double).

Angenommen, Du adaptierst dies, so bekäme Dein INSERT plötzlich folgendes Bild ...
Code:
$insert = "INSERT INTO
   `saer_podidate`
SET
   `podizei_datum`='" . $MeinArray[$i]['datum'] . "',
   `podizei_von`='" . $MeinArray[$i]['von'] . "',
   `podizei_bis`='" . $MeinArray[$i]['bis'] . "',
   `podizei_bemerkung`='" . $MeinArray[$i]['bemerkung'] . "';";

Da Du später an Deine Datenbank $insert zur Verarbeitung gibst (mysqli/PDO), baust Du einen "String" als Befehl auf - Deine Variablen werden (zwecks besserer Lesbarkeit) von mir als Konkatenation mit "." eingebaut. $i sei in dem obigen Beispiel einfach mal 0 (nicht vergessen!).

Anderer Weg: Wenn Du in "phpMyAdmin" (das ist es übrigens) oben auf EINFÜGEN klickst, kannst Du manuell einen Datensatz anlegen (musst die Felder manuell einfach nur ausfüllen). Bei Erfolg zeigt Dir phpMyAdmin auch den benutzten Query an - dann hättest Du einen Vergleich zwischen dem, was Du bislang hast und dem, wie es sein muss.

Bedenke, dass dies weiterhin alles "ungeprüft" ist - ich könnte also zügig über einen Eingriff auf die POST-Variable für 'datum' Deine Datenbank zum eigenen Löschen auffordern!

Regel Nr. 1: Alles, was vom Client eines Besuchers kommt, ist giftig! Was nicht erwartet wird, wird abgewiesen (nicht versuchen, korrekt zu machen o. ä.). Was im falschen Format nach bspw. Cast-Operatoren vorliegt, wird abgeschmettert usw.

Aber nochmal: Du benötigst für sowas dringend (!) mehr Grundwissen!!!
 

Phips_CH

Noch nicht viel geschrieben

Also was mein Grundwissen angeht habt Ihr sicher nicht unrecht.
Es fehlt sicher auch an Erfahrung. Und Ob das Selbststudium der richtige Weg ist, wag ich auch immer mehr zu bezweifeln.
Aber das alles lässt sich so ohne weiteres und von Heut auf Morgen nicht ändern.

Wieso hab ich am Schluss nichts in meiner Datenbank?
Das echo zeigt es mir immer schön an. also läuft die Schleife sauber durch.

Muss ich bei meinem Formular noch eine Action definieren?
Oder wo könnte der Fehler noch sein?

Es ist nicht so, dass ich nicht diverse Sachen versuche bevor ich hier einen Eintrag mache, auch wenn es vielleicht den Anschein macht.

Gruss
Phips_CH
 

Curanai

Aktives Mitglied

Hey Phips,

schaue ich mir obige Sources von Dir an, gehe ich davon aus, dass es keine Verbindung zur Datenbank gibt und Du der Meinung bist, dass das Aufbereiten des Strings bereits reicht. Das reicht aber leider nicht ...

Da ich jetzt auch mal Feierabend mache, wünsche ich Dir erstmal einen schönen Abend.
 

Phips_CH

Noch nicht viel geschrieben

Guten Tag

Ich würde behaupten, dass die Verbindung steht. denn eine DB-Abfrage (Mit Hilfe von DW) funktioniert.
Und wenn ich die Abfrage mit echo ausgebe, zeit es mir diese auch an.
Oder hab ich da wieder einen Überlegungsfehler?
 

afr0kalypse

Allwissendes Karmameerschweinchen!

Um deine Datenbank nutzen zu können, musst du ein Script haben, welches Zugriff auf die Datenbank ermöglicht. Ebenso brauchst du ein Script um Daten zur Datenbank zu brinen.

z.B. sowas:
PHP:
//Verbindung aufbauen
$con = mysqli_connect('Dein Datenbank Host', 'Dein Datenbank User', 'Dein Passwort', 'Dein Datenbankname');
if(!$con) {
   echo("Fehler bei der Verbindung: " . mysqli_connect_error());
   exit;
}

//.... Deine Schleife

$sql_query = "INSERT INTO `saer_podidate`(`podizei_datum`, `podizei_von`, `podizei_bis`, `podizei_bemerkung`)
VALUES($MeinArray[$i]['datum'], $MeinArray[$i]['von'], $MeinArray[$i]['bis'], $MeinArray[$i]['bemerkung'])";
$result = mysqli_query($con, $sql_query);
if(!$result) {
   echo("Fehler im SQL Statement: " . mysqli_error($con));
   exit;
}
var_dump($con);
 

Phips_CH

Noch nicht viel geschrieben

Ich bin doch nicht ganz dso doof. Wieso schaff ich das denn nicht?
Jetzt erhalte den Fehler:
Fehler im SQL Statement: 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 '['datum'], ['von'], ['bis'], ['bemerkung'])' at line 2

Was bedeutet dieser Fehler?
 

Phips_CH

Noch nicht viel geschrieben

Sorry! Mein Fehler.
Es läuft jetzt sogar.

Aber jetzt füllt er jedes Feld in die Datenbank. auch wenn nichts drin steht. er trägt dann NULL ein.

Ist es ratsam, das ganze noch einmal in eine übergeordnete Schleife zu packen, die abfragt, etwas im Array steht?
Steht denn auch "NULL" im Array? oder wie frag ich "irgendetwas" ab?
 

Phips_CH

Noch nicht viel geschrieben

Jetzt fällt mir erst auf,
Die Schleife schreibt mir nur 4 Zeilen in die Datenbank.
hat es möglicherweise damit zu tun, das ich Felder pro Zeile habe?
denn bei der Schleife frag ich doch die Anzahl $i in MeinArray ab. Und das sind 4.

Code:
// Coutn = 6. <= da wir ja mit 1 und nicht 0 beginnen, sonst würde 6 nie ausgelesen werden.
// alternative i < count(MeinArray) +1
for($i = 1; $i <= count($MeinArray[$i]); $i++){
// abarbeitung
 

Curanai

Aktives Mitglied

Hey Phips,

zunächst einmal solltest Du zwingend akzeptieren, dass Programmiersprachen ihren (autom.) Index immer bei (integer) 0 beginnen - IMMER. Du kannst dann zwar den Index künstlich hochsetzen, aber die Umgewöhnung (Akzeptanz) geht deutlich einfacher.

Statt einer iterativen for()-Schleife (Schleife, die sich hochzählt), wäre der Einsatz von foreach() vielleicht interessanter - und performanter; das aber nur am Rand. :)

Code:
foreach($meinArray as $idx => $val){
   // $idx (frei definierter Name) steht jetzt bei Dir $i drin
   // $val (frei definierter Name) sind die Inhalte enthalten, die ankommen für ein "meinArray"
 
   var_dump($val); // damit Du die Werte siehst!
 
   $insert = "INSERT INTO
    `saer_podidate`
   SET
    `podizei_datum`=\"" . $val['datum'] . "\",
    `podizei_von`=\"" . $val['von'] . "\",
    `podizei_bis`=\"" . $val['bis'] . "\",
    ...";
 
   echo $insert . "<br />";
 
   // und noch auf die Datenbank abfeuern! - nur $insert bauen, reicht nicht! :)
}

Ich erwähnte bereits, dass das kein guter Stil ist und dem MySQL-Server durchaus zu viel Performance (naja) raubt.

Besser wäre also, alle Inserts in einem zusammenzufassen:
Code:
$insert = "INSERT INTO
   `saer_podidate` (`podizei_datum`, `podizei_von`, `podizei_bis`, ... ) VALUES ";

foreach($meinArray as $idx => $val){
   $insert .= "(\"" . $val['datum'] . "\", \"" . $val['von'] . "\", \"" . $val['bis'] . "\"),";
   var_dump($val); // auch hier zum Nachprüfen
}

// Achtung, am Ende befindet sich jetzt ein Komma zuviel - das muss weg:
$insert = substr($insert, 0,-1);

echo $insert . "<br />";

// und wieder auf die Datenbank - alles schön in einem Befehl!

Je nach PHP-Version kannst Du auch eine andere Schreibweise nehmen: mit { und } als Delimiter. Aber das lassen wir erstmal, um keine weitere Verwirrung zu stiften. :p

Soooo ... aber wir haben noch ganz andere Probleme - z. B. das richtige FORMAT für den Insert auf der jeweiligen Spalte. Ich quote mich mal selbst:
DATE ... MySQL unterstützt hier 1000-01-01 bis 9999-12-31 ... gespeichert wird hier als 'YYYY-MM-DD'. Gleiches gilt für TIME (als HH:MM:SS) ...

Was schreibt der Benutzer also in das Feld und wie sieht es buchstäblich aus? Schreibt ein Nutzer für das Datum wirklich 2014-07-27 (für heute)?

Zuguterletzt, da wir so langsam uns dem Ziel nähern: Trage ich was "Nettes" bei Dir ein, lösche ich Deine Datenbank - ich sage es nochmal. Bevor Du also irgendwas vom Client (Browser eines Benutzers) annimmst und speicherst, heißt es IMMER: PRÜFEN und im Falle von unerwarteten Abweichungen VERWERFEN (aka Verweigern)!



EDIT: Bevor mich wer fragt, warum ich keine "prepared statements" an den Phips gebe, so möge der User bitte verstehen, was der TO selbst oben gepostet hat und wie weit er in der Thematik selbst ist. "prepared statements" ist was für später ... noch nicht jetzt!
 
Zuletzt bearbeitet:
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

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.612
Beiträge
1.538.343
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben