Zum Inhalt springen
  • 0

PHP - Daten in Datenbank


MauriceL01

Frage

Hallo Zusammen,

ich beschäftige mich zurzeit mit einem privaten HTML/PHP Projekt. Dazu muss ich sagen, das ich vorher noch nicht wirklich mit PHP gearbeitet habe.

Ich habe ein Formular, aus welchem ich Daten in eine lokale DB schreiben möchte. 

Habe folgendes gemacht, bekomme aber immer Fehlermeldungen, bei dieser Variante zum Beispiel: "Parse error: syntax error, unexpected '$kdnr' (T_VARIABLE), expecting ')' in C:\dev\XAMPP\htdocs\Testsystem\customer\kundenstammPassiv.php on line 31"

Vorher hatte ich eine andere Variante probiert, da bekam ich immer folgenden Fehler: "Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: parameter was not defined’ in."

 

Kann mir jemand helfen, welche ist die beste Variante und wie wende ich sie an? Was mache ich falsch?

 

Aktuelle Variante:
image.thumb.png.cc2ef6442adc9bb5ff9434a1622c4406.png

 

 

mysql.php:

image.png.23fd214b81ba4661573c57361d393dea.png

 

Freue mich über eure Hilfe. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

14 Antworten auf diese Frage

Empfohlene Beiträge

  • 0
vor 43 Minuten schrieb Funfare1337:

zwischen $_POST['ansprechpartner'] und $kdnr fehlt ein komma, deshalb der syntax error

außerdem verwechsle nicht das mysqli bindParam mit dem PDO bindparam: https://www.php.net/manual/de/pdostatement.bindparam.php

Danke für die schnelle Antwort.

Bedeutet ich muss für jede Variable, den Variablentyp und die Länge angeben?

Also Beispielsweise so?
$sth->bindParam(1$_POST["firma"]PDO::PARAM_STR 255);
$sth->bindParam(2$_POST["fax"]PDO::PARAM_INT);

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

$data_type und $length sind optional. Angeben musst du sie nicht. Ich bin zwar kein PHP-Experte aber ich würde sie angeben. Ich kann mir vorstellen, dass sie auch genutzt werden, um XSS-Angriffe zu verhindern (schwache Typisierung und so).

Wenn du sie aber benutzt, dann musst du $data_type und $length mit einem Komma trennen:

$sth->bindParam(1, $_POST["firma"], PDO::PARAM_STR, 255);
$sth->bindParam(2, $_POST["fax"], PDO::PARAM_INT);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Die länge brauchst du im normalfall nicht, der Parameter ist optional

Der Typ ist auch optional und per default string, da würde ich aber empfehlen abweichende Typen entsprechend zu berücksichtigen. Ansonsten ja, so musst du jeden Parameter übergeben. Da auch gleich der Tipp, statt Fragezeichen kannst du auch named Parameter verwenden. Das macht das wesentlich übersichtlicher

 


<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

Fax solltest du übrigens nicht als INT speichern bzw übergeben, das wäre Fehlerhaft wegen der führenden 0 bzw + zeichen (+491235, 03012345 etc)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 1 Minute schrieb Funfare1337:

Die länge brauchst du im normalfall nicht, der Parameter ist optional

Der Typ ist auch optional und per default string, da würde ich aber empfehlen abweichende Typen entsprechend zu berücksichtigen. Ansonsten ja, so musst du jeden Parameter übergeben. Da auch gleich der Tipp, statt Fragezeichen kannst du auch named Parameter verwenden. Das macht das wesentlich übersichtlicher

 



<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

Fax solltest du übrigens nicht als INT speichern bzw übergeben, das wäre Fehlerhaft wegen der führenden 0 bzw + zeichen (+491235, 03012345 etc)

Vielen Dank!

Ich werde es mal so probieren und fax als String speichern.

Danke! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 2 Minuten schrieb Whiz-zarD:

$data_type und $length sind optional. Angeben musst du sie nicht. Ich bin zwar kein PHP-Experte aber ich würde sie angeben. Ich kann mir vorstellen, dass sie auch genutzt werden, um XSS-Angriffe zu verhindern (schwache Typisierung und so).

Wenn du sie aber benutzt, dann musst du $data_type und $length mit einem Komma trennen:


$sth->bindParam(1, $_POST["firma"], PDO::PARAM_STR, 255);
$sth->bindParam(2, $_POST["fax"], PDO::PARAM_INT);

 

Danke für deine Antwort. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 5 Minuten schrieb Whiz-zarD:

$data_type und $length sind optional. Angeben musst du sie nicht. Ich bin zwar kein PHP-Experte aber ich würde sie angeben. Ich kann mir vorstellen, dass sie auch genutzt werden, um XSS-Angriffe zu verhindern (schwache Typisierung und so).

Mit XSS Angriffen hat das nichts zu tun. Für SQL-Injection sind schon die prepared statements zuständig, bei der Ausgabe muss man dass dann selber übernehmen.

Die Länge ist nur beim Aufruf einer stored procedure relevant, damit wird festgelegt dass das eine Output-Variable ist und die maximale Länge des Outputs festgelegt. Bei den normalen selects, updates, deletes etc. wird das also nicht benötigt.

 

<?php
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);

$stmt->execute();

print "Rückgabewert der Stored Procedure: $return_value\n";
?>

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 19 Stunden schrieb Funfare1337:

Die länge brauchst du im normalfall nicht, der Parameter ist optional

Der Typ ist auch optional und per default string, da würde ich aber empfehlen abweichende Typen entsprechend zu berücksichtigen. Ansonsten ja, so musst du jeden Parameter übergeben. Da auch gleich der Tipp, statt Fragezeichen kannst du auch named Parameter verwenden. Das macht das wesentlich übersichtlicher

 



<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

Fax solltest du übrigens nicht als INT speichern bzw übergeben, das wäre Fehlerhaft wegen der führenden 0 bzw + zeichen (+491235, 03012345 etc)

Hallo nochmal,

 

ich habe das Ganze nun nach dem Schema aufgebaut.

Es funktioniert trotzdem nicht... :(

image.thumb.png.809e7c01b4ff6d48f16f98f26a76d3b9.png

 

Folgende Fehlermeldung erscheint beim abrufen:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\dev\XAMPP\htdocs\Testsystem\customer\kundenstammPassiv.php on line 51



Ich habe jetzt eventuell noch eine Vermutung... Das Formular, mit den Feldern, welche ich wegschreiben möchte, ist in der "kundenstamm_fields.php". Das PHP-Skript, um welches es hier geht, befindet sich in der Klasse "kundenstammPassiv.php". Ist das verwerflich, oder kann das so funktionieren, weil ich es mittels eines includes nachlade?

 

Freue mich über Hilfe.

 

Gruß

Maurice :)

Bearbeitet von MauriceL01
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Hallo,

kannst du mal markieren was die Zeile 51 in kundenstammPassiv.php ist? In deinem Screenshot sind es nicht so viele Zeichen, der Code sieht für mich soweit korrekt aus. Wird evtl. noch ein anderes Query in der Datei ausgeführt?

Es kann natürlich mit include funktionieren, aber ohne den Code zu sehen ist das natürlich schwierig zu sagen ob sich da ein Fehler eingeschlichen hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 20 Minuten schrieb Funfare1337:

Hallo,

kannst du mal markieren was die Zeile 51 in kundenstammPassiv.php ist? In deinem Screenshot sind es nicht so viele Zeichen, der Code sieht für mich soweit korrekt aus. Wird evtl. noch ein anderes Query in der Datei ausgeführt?

Es kann natürlich mit include funktionieren, aber ohne den Code zu sehen ist das natürlich schwierig zu sagen ob sich da ein Fehler eingeschlichen hat.

Danke für deine Antwort. :)
Hier mal die Dateien mit Zeilennummern.

kundenstammPassiv.php
image.thumb.png.08b1fbbf6bb0f720c500f3d012dd70e4.png

kundenstamm_field.php
image.thumb.png.60872e9c6b1426250bf748d4f68db2cc.png

 

Vielleicht kanns du ja hier mehr sehen?

Vielen Dank schonmal im voraus. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Im prepare steht "kundenummer", im bind-params aber "kundennummer". 

Noch zwei Tipps:

  • Du kannst hier im Forum direkt Code posten, indem du auf den <>-Button klickst und den Code einfügst. Das ist für die meisten angenehmer zu lesen als Screenshots.
  • In deiner IDE ist bei 80-100 Zeichen rum ein heller Strich. Dieser markiert, wann du deine Zeilen umbrechen solltest. Quasi ist Platz nach rechts "teuer", nach unten "billig". Ggf. auch ein Linting verwenden. 
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 2 Minuten schrieb pr0gg3r:

Im prepare steht "kundenummer", im bind-params aber "kundennummer". 

Noch zwei Tipps:

  • Du kannst hier im Forum direkt Code posten, indem du auf den <>-Button klickst und den Code einfügst. Das ist für die meisten angenehmer zu lesen als Screenshots.
  • In deiner IDE ist bei 80-100 Zeichen rum ein heller Strich. Dieser markiert, wann du deine Zeilen umbrechen solltest. Quasi ist Platz nach rechts "teuer", nach unten "billig". Ggf. auch ein Linting verwenden. 

Vielen Dank für die Info!

- den Rechtschreibfehler habe ich behoben, somit erscheint beim Absenden der Daten keine Fehlermeldung mehr. Die Tabelle bleibt aber leider noch immer leer, bedeutet, die Daten werden nicht in die DB geschrieben...

Woran könnte das denn jetzt noch liegen? ... Manchmal scheitert man an so simplen Dingen^^ :(

- Danke für die Tipps, wusste ich noch nicht. Werde ich ab sofort aber so machen. :)

 

Gruß

Maurice

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 13 Minuten schrieb Funfare1337:

Füge beim Aufbau der DB-Verbindung mal folgende Zeile ein (variablennamen natürlich noch anpassen), dann solltest du eine Fehlermeldung bekommen wenn etwas schief läuft:


$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

Vielen Dank!!!!

Habe ich gemacht. Hat funktioniert, habe folgende Fehlermeldung bekommen:

"Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'addresszeile2' in 'field list' in C:\dev\XAMPP\htdocs\Testsystem\customer\kundenstammPassiv.php:59 Stack trace: #0 C:\dev\XAMPP\htdocs\Testsystem\customer\kundenstammPassiv.php(59): PDOStatement->execute() #1 {main} thrown in C:\dev\XAMPP\htdocs\Testsystem\customer\kundenstammPassiv.php on line 59"

 

Mit dieser konnte ich den Fehler dann selber herausfinden und beheben. War mal wieder so ein blöder kleiner Fehler...

Nun hat es auch geklappt und die Daten stehen in der DB.

Danke für deine Hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...