Ankündigung

Einklappen
Keine Ankündigung bisher.

Prepared Statement will einfach nicht funktionieren...ich verzweifle

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Prepared Statement will einfach nicht funktionieren...ich verzweifle

    Moin,

    also ich bin ein absoluter anfänger auf dem Gebiet und es ist wahrscheinlich nur eine Kleinigkeit aber bei mir will es einfach nicht funktionieren.

    Dies ist mein prepared Statement...für mich sieht dies auch richtig aus.

    PHP-Code:
      $user $db_link ->prepare("Select * from benutzer where personalnummer = ?"); $user->bind_param("i",$personalnummer); $user->execute(); 
    Personalnummer wird eingelesen mit 1 und es gibt in meiner Datenbank auch jemand mit Personalnummer 1 aber es wird mir nach
    $user->num_rows immer nur der Wert 0 zurückgegeben. Ändere ich die Abfrage zu
    PHP-Code:
        $user $db_link ->query("Select * from benutzer where personalnummer = 1"); 
    Bekomme ich nach $user->num_rows '1' zurück also hat es hier offensichtlich geklappt. Ich bin maximal verwirrt und weiß nicht mehr was ich ändern soll oder kann...meiner Meinung nach habe ich alles probiert was geht.

  • #2
    Per "insert into" kann ich auch daten in die DB reinschreiben aber mit select und mir das die entsprechende Anzahl der Zeilen anzeigen lassen oder die kompletten Daten bekomm ich nicht hin

    Kommentar


    • #3
      Was ist denn personalnummer für ein Datentyp(int, varchar)?

      Kommentar


      • #4
        Hab ich als int in der db hinterlegt

        Kommentar


        • #5
          Zitat von protestix Beitrag anzeigen
          Was ist denn personalnummer für ein Datentyp(int, varchar)?
          Hab ich als int gespeichert

          Kommentar


          • #6
            https://www.php.net/manual/en/mysqli-stmt.num-rows.php

            Returns the number of rows in the result set. The use of mysqli_stmt_num_rows() depends on whether or not you used mysqli_stmt_store_result() to buffer the entire result set in the statement handle.
            mysqli ist das C Interface quasi 1:1 in PHP abgebildet. Das ist an vielen Stellen nicht wirklich intuitiv und auch PHP fremd. Schau dir vielleicht besser PDO an.

            Kommentar


            • #7
              Prepared Statement mit Mysqli ist wirklich nicht intuitiv, keine benamten Parameter und die Anzahl der betroffenen Datensätze ist auch erst mal unbekannt

              Hier die Gegenüberstellung von Mysqli und PDO
              *Achte auf die Spalten- und Tabellennamen, die sind hier anders
              PHP-Code:
              <?php
              /* Fehlerausgabe für Mysql einschalten */
              mysqli_report(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);

              $db_link = new mysqli('localhost''root''NeuesPasswort''test');

              $personalnummer =2;

              $stmt $db_link ->prepare("SELECT id, first_name FROM contacts WHERE id=?");
              $stmt->bind_param("i",$personalnummer);
              $stmt->execute();  

              /* binde das Ergebnis an Variablen zur Vorbereitung einer Ausgabe */
              $stmt->bind_result($col1$col2);

              /* hole Datensatz pro Durchlauf */
              while ($stmt->fetch()) {
                  echo 
              $col1 " - " $col2 "<br>";
              }
              $stmt->close();


              /* PDO Variante */
              $dsn  'mysql:dbname=test;host=localhost;charset=utf8';
              $user 'root';
              $pass 'NeuesPasswort';
              $options = [
                  
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                  
              PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                  
              PDO::ATTR_EMULATE_PREPARES => false
              ];
              /* Verbindung zur Datenbank herstellen */
              $pdo = new PDO($dsn$user$pass$options);

              $personalnummer =2;

              $sql "SELECT id, first_name FROM contacts WHERE id=:id";
              $stmt $pdo->prepare($sql);

              $params = array(':id' => $personalnummer);
              $stmt->execute($params);

              /* Anzahl der betroffenen Datensätze */
              echo $stmt->rowCount();
              echo 
              "<br>";

              /* hole Datensatz pro Durchlauf */
              while ($row $stmt->fetch()) {
                  echo 
              $row->id" - " $row->first_name "<br>";
              }
              ?>
              SELECT * darf man auf Mysqli bei Verwendung von prepared statements auf keinen Fall anwenden, da die Anzahl der zurückgegebenen Spalten bekannt sein muss.
              Werden z.B. 4 Spalten zurückgegeben aber nur 2 Spalten mit bind_result gebunden, führt das zu einer Fehlermeldung.
              Auf das Anführen der zurückgegebenen Datensätze mit Mysqli habe ich hier verzeichtet, da ich da auch nicht mehr im Thema stehe und die Daten vorab mit store_result gespeichert werden müssen.

              Im Gegenzug bitetet das PDO ohne Probleme an.
              Ich kann mich erc nur anschliessen und PDO empfehlen, gerade wenn man Anfänger ist sollte man sich gleich mit PDO beschäftigen, so muss man nicht doppelt Lernen.

              Kommentar


              • #8
                Zitat von protestix Beitrag anzeigen
                SELECT * darf man auf Mysqli bei Verwendung von prepared statements auf keinen Fall anwenden, da die Anzahl der zurückgegebenen Spalten bekannt sein muss.

                Nicht zwingend, dass ist das C Inferface und die vereinfachnung nach PHP. Das machts nicht unmöglich, aber umständlich. Spielt aber eigentliuch auch keine Rolle, da SELECT * so oder so nur in Ausnahmesituationen sinnvoll ist.
                Alternativ gibts auch die Möglichkeit in PHP mit get_result() ein "mysqli_result" zu bekommen. Das Verhält sich dann wie das Ergebnis eines normalen Queries.

                PHP-Code:
                $stmt $db_link->prepare("SELECT id, first_name FROM contacts WHERE id=?");
                $stmt->bind_param("i",$personalnummer);
                $stmt->execute();  

                $result $stmt->get_result();

                echo 
                $result->num_rows;

                foreach (
                $result as $row)
                    echo 
                $row['id']...;

                Kommentar


                • #9
                  ich danke euch allen
                  das hat meine Probleme gelöst
                  mein nächster Schritt wäre auch gewesen PDO zu verwenden

                  Kommentar

                  Lädt...
                  X