PHP Insert in MySql geht nicht

  • PHP

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von hans im glück.

    PHP Insert in MySql geht nicht

    Hi Leute,

    ich habe folgenden Code:

    PHP-Quellcode

    1. <?php
    2. $host_name = "db";
    3. $database = "dbname";
    4. $user_name = "dbuser";
    5. $password = "dbpw";
    6. $conn = mysqli_connect($host_name, $user_name, $password, $database);
    7. if ($conn->connect_error)
    8. {
    9. echo "Verbindung zum MySQL Server fehlgeschlagen: " . mysqli_connect_error();
    10. } else {
    11. echo "Verbindung zum Server aufgebaut!" ;
    12. }
    13. $stmt =$conn->prepare("INSERT INTO loginreg (id,PcName, Username, Password, Zeit) VALUES (?,?,?,?,?)");
    14. $stmt->bind_param("issss",$id, $PCNAME, $Username, $Password, $Zeit);
    15. // set parameters and execute
    16. $PCNAME = "wird später mit GET übergeben ";
    17. $Username = "wird später mit GET übergeben";
    18. $Password = "wird später mit GET übergeben";
    19. $Zeit = "mit GET oder in der MySql mit Current Timestamp eingetragen ";
    20. $id = "Null";
    21. $stmt->execute();
    22. $stmt->close();
    23. $conn->close();
    24. ?>


    Es kommt keine Fehlermeldung, leider kommt aber auch kein Eintrag zu stande.

    Wenn ich in PHP MyAdmin manuell eine Zeile eintrage geht das.

    Das Feld "id" steht auf AI, Schreibweisen der Spalten habe ich auch abgeglichen.

    Gibt es irgendwie eine Möglichkeit DB Fehler oder sowas einzusehen die vllt. durch das Skript nicht ausgegeben werden?
    Kenne mich in der Thematik überhaupt nicht gut aus.

    Ziel ist später die Anzahl von Loginversuchen einer Anwendung mittels Web Request in der Datenbank fest zu halten.
    Ist hierfür der Get Befehl in Ordnung?

    Allg. Kritik zum PHP Script ist natürlich auch gerne gesehen.

    *Topic verschoben*
    Gruß Hannes

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hi

    Ich schätz mal dass du die variablen zum Zeitpunkt des Inserts keinen wer haben
    laaa dir mal direkt vor dem Insert die Inhalte der variablen ausgeben und/oder:
    probier mal deine Code so zu ändern, dass er wie auf php.net(php.net/manual/de/mysqli-stmt.bind-param.php) ist. Also mit mysqli-prepare usw.


    lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Ich werde es probieren glaub aber nicht dass es was bringt die Zuweisung vorher durch zu führen, ist in deinem Bsp ja auch so wie bei mir. Man kann auf die Art wohl mehrere Rows einfügen indem man nach dem Execute einfach die var Zuweisung ändert...
    Gruß Hannes

    hans im glück schrieb:

    die Zuweisung vorher durch zu führen
    Mich verwirrt nur der Text, den du als Zuweisung für deine variablen verwendest "wird später mit GET übergeben";

    Aber wie ich bereits gesagt,hab, lass die Inhalte der Variablen kurz vor dem Exceuten direkt ausgeben. Ein Arbeitskollege hatte ein ähnliches Problem, bei dem war das Query auch immer leer, er hat such kurz vor dem Excuten den Inhalt des Query ausgeben lassen und da war halt INSERT INTO (...) VALUES ('', '', '')
    Er hatte halt nur vergessen die Variablen wirklich per GET noch zu erhalten.

    LG Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Kritik? Hier:
    - inkonsistente Formatierung/Einrückung
    - inkonsistentes Namensschema
    - Login-Requests stets per POST durchführen
    - das Speichern des Passworts (auch bei Fehlversuch) ist grob fahrlässig
    - wenn id das Attribut auto increment hat, gib es nicht in der Query etc. mit an
    - bei Verbidnungsfehler versucht du trotzdem das Insert auszuführen
    - du prüft nicht den Rückgabewert von: prepare, bin_param und execute
    - benutze beim entwickeln: error_reporting(-1); ini_set('display_errors', 1);
    - Fehler bekommst du auch über $stmt->error / $stmt->errno
    - Fehler ohne Anzeige: Log sie in einer Datei. Wenn du einen eigenen Server hast, kannst du generierte Warnungen/Fehler von PHP per Ini-Eintrag loggen lassen. Ansonsten ist auch set_error_handler und set_exception_handler einen Blick Wert. Oder du benutzt ein Framework wo das schon alles drin ist...
    - wenn du schon die OOP-Variante von mysqli verwendest, nimm: $conn = new mysqli(...) anstatt mysqli_connect
    @Manawyrm:

    Manawyrm schrieb:

    Er verwendet korrekterweise Prepared Statements und baut die SQL-Query nicht selbst zusammen
    Wo hab ich denn behauptet, dass er das nicht macht?
    Ich hab ihm doch nur vorgeschlagen, er soll sich mal den Inhalt des Queries ausgeben und dass mich der Zuweisungstext etwas verwirrt. Mehr ned.
    Und falls doch: Sry für die Unterstellung

    Manawyrm schrieb:

    Wäre ich gerade nicht +25h wach
    Ok dann schlaf dich mal aus ;D
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    so ich habe mir jetzt dank der hilfreichen beiträge mal die dinge vorgenommen die ich am schnellsten optimieren konnte.

    ich habe mir eine kleine "test" tabelle angelegt auf dem mysql server (der übrigens bei 1und1 läuft).

    erst mit der spalte 'ID' mit AI und 'Name' als Text.

    Da hat alles auf Anhieb geklappt.
    Dann habe ich eine zweite Spalte - auch Text - 'Username' hinzugefügt.

    Mit

    Quellcode

    1. echo $stmt->error;
    habe ich mir am Schluss dann den Fehler :
    Incorrect arguments to mysqld_stmt_execute

    eingefangen.

    HIer das neue Script:

    Quellcode

    1. $conn = new mysqli($host_name, $user_name, $password, $database);
    2. if ($conn->connect_error)
    3. {
    4. die("Connection nicht aufgebaut: " . $conn->connect_error);
    5. }
    6. echo "Verbindung zum Server aufgebaut!" ;
    7. $stmt =$conn->prepare("INSERT INTO test(Name,Username) VALUES (?,?)");
    8. $stmt->bind_param("ss",$PCNAME, $Username);
    9. // set parameters and execute
    10. $PCNAME = "JohnPC";
    11. $Username = "Doe";
    12. $stmt->execute();
    13. echo $stmt->error;
    14. $stmt->close();
    15. $conn->close();
    Gruß Hannes
    @Manawyrm: Zu deiner Aussage dass man in dem Query ned viel sehen wird - is mir schon klar. Aber
    ​vor dem Insert die Inhalte der variablen ausgeben

    Dass ich einmal von
    Queries ausgebe​
    geredet hab, tut mir leid, meinte natürlich wie bereits vorhin den Inhalt der Variablen.
    lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    habe folgendes geändert (auch in der db vorsichtshalber)
    Spoiler anzeigen

    Quellcode

    1. $stmt =$conn->prepare("INSERT INTO test(`Name`,`Usern`) VALUES (?,?)");
    2. $stmt->bind_param("ss",$PCNAME, $Username);
    3. // set parameters and execute
    4. $PCNAME = "JohnPC";
    5. $Username = "Doe";
    6. $stmt->execute();
    7. echo $stmt->error;
    8. $stmt->close();
    9. $conn->close();



    dann kommt leider immernoch:
    Incorrect arguments to mysqld_stmt_execute
    Gruß Hannes
    Deine Syntax ist wie für ein UPDATE-Command.
    Gibt es MySql-Implementationen die ein INSERT-Konstrukt mit VALUES überhaupt unterstützt?
    Ansonsten dürfte es auch mit einem Parameter schon nicht funktioniert haben.

    Ich kenne nur so was: INSERT INTO tab SET `col1`='test'


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    leute das tut schon fast weh...in einem anderen forum hab ich bei der gleichen fehlermeldung bemerkt dass auch die bei 1und1 sind und ein php update von 5.1 auf 5.5 hilft...also version gecheckt, hab jetzt stand 5.6 und seither läuft alles...naja zeitverschwendung wars nicht. hab ja noch was gelernt.
    Gruß Hannes