Ankündigung

Einklappen
Keine Ankündigung bisher.

Umstieg von Mysqli auf Pdo | Hilfe beim umschreiben der Abfragen.

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

  • Umstieg von Mysqli auf Pdo | Hilfe beim umschreiben der Abfragen.

    Hey,

    ich habe mich nun endlich auch mal dazu entschieden von mysqli auf pdo umzusteigen. Nun habe ich aber ein paar schwierigkeiten mit dem umbauen meiner sql abfragen.
    Ich habe mir dieses Tutorial angeschaut: https://phpdelusions.net/pdo und komme aber noch nicht ganz zurecht. Die verbindung zur Datenbank habe ich schonmal hergestellt und das scheint auch zu funktionieren.
    Nun bin ich dabei meine Login Seite wieder ans laufen zu bekommen und da komme ich nicht weiter. Mich verwirrt dass man so wenige "funktionen" ausführen muss und keine close funktion hat.

    Könnte sich das mal jemand ansehen und mir erklären auf was ich da verzichten kann? Oder wo ich noch etwas hinzufügen sollte?
    Da ist auch noch ein fehler drin, aber ich kann den nicht finden.

    Hier einmal die verbindung zur db:
    PHP-Code:
    <?php
    /* ========== Database ========== */

    $whitelist = array('127.0.0.1''::1''localhost');

    if(!
    in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    $servername "";
    $dBUsername "";
    $dBPassword "";
    $dBName "";
    $charset 'utf8mb4';

    echo 
    '<script>console.log("Active Database: Work DB")</script>';
    } else {
    $servername "";
    $dBUsername "";
    $dBPassword "";
    $dBName "";
    $charset 'utf8mb4';

    echo 
    '<script>console.warn("WARNING! Active Database: Testing")</script>';
    }

    //$conn = mysqli_connect($servername, $dBUsername, $dBPassword, $dBName);
    $dsn "mysql:host=$servername;dbname=$dBName;charset=$ch arset";
    $options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
    ];

    try {
    $pdo = new PDO($dsn$dBUsername$dBPassword$options);
    } catch (\
    PDOException $e) {
    throw new \
    PDOException($e->getMessage(), (int)$e->getCode());
    }

    /*if(!$conn){
    die("Connection failed: ".mysqli_connect_error());
    }*/
    Hier einmal der Aktuelle Code:
    PHP-Code:
    //User Login
    if (isset($_POST['submit_login'])){
    require_once 
    "dbh.inc.php";
    $url '../login.php?a=';

    $mail_username $_POST['mailuser'];
    $password $_POST['password'];

    if(empty(
    $mail_username) || empty($password)){
    header("Location: $url'info_empty');
    exit();
    }
    else {
    $sql "SELECT * FROM users WHERE username=? OR email=?";
    $stmt $pdo->prepare($sql);
    $stmt->execute([$mail_username$mail_username]);
    $user $stmt->fetch();
    /*$sql = "SELECT * FROM users WHERE username=? OR email=?;";
    $stmt = mysqli_stmt_init($conn);*/
    if(!mysqli_stmt_prepare($stmt$sql)){
    header("Location: $url'danger_sqlerror');
    exit();
    }
    else {
    //mysqli_stmt_bind_param($stmt, "ss", $mail_username, $mail_username);
    //mysqli_stmt_execute($stmt);
    //$result = mysqli_stmt_get_result($stmt);
    if($row mysqli_fetch_assoc($result)){
    $passwordCheck password_verify($password$row['password']);
    if(
    $passwordCheck == false){
    header("Location: $url'warning_incorrectpassword');
    exit();
    }
    else if(
    $passwordCheck == true){

    $userid_name "userId";
    $userid_value $row['id'];
    setcookie($userid_name$userid_valuetime() + (7200), "/"); // 7200 = 2 Stunden

    $username_name "userName";
    $username_value $row['username'];
    setcookie($username_name$username_valuetime() + (7200), "/"); // 7200 = 2 Stunden

    $useraccess_name "userAccess";
    $useraccess_value $row['access'];
    setcookie($useraccess_name$useraccess_valuetime() + (7200), "/"); // 7200 = 2 Stunden

    $useremail_name "userMail";
    $useremail_value $row['email'];
    setcookie($useremail_name$useremail_valuetime() + (7200), "/"); // 7200 = 2 Stunden // 3600 = 1 Stunde

    $usertheme_name "userTheme";
    $usertheme_value $row['theme'];
    setcookie($usertheme_name$usertheme_valuetime() + (7200), "/"); // 7200 = 2 Stunden

    $date date('Y-m-d H:i:s');
    $date date('Y-m-d H:i:s',strtotime($date));

    /*$sql = "UPDATE users SET last_login = now() WHERE id=" . $row['id'];
    $query = mysqli_query($conn,$sql);
    mysqli_close($conn);*/

    $sql "UPDATE users SET last_login = now() WHERE id=?";
    $stmt $pdo->prepare($sql);
    $stmt->execute([$row['id']]);

    if(
    $_COOKIE['userAccess'] !== 775){
    header("Location: ../index.php?a=" 'success_login');
    exit();
    } else {
    header("Location: ../manage_news.php?a=" 'success_login');
    exit();
    }
    }
    else{
    header("Location: $url'warning_incorrectpassword');
    exit();
    }
    }
    else {
    header("Location: $url'danger_nouserfound');
    exit();
    }
    }
    }
    //mysqli_stmt_close($stmt);
    //mysqli_close($conn);

    Zuletzt geändert von Nightland Driver; 11.02.2021, 14:28.

  • #2
    Hi Nightland Driver,
    ich warum möchtest du unbedingt zu pdo wechseln? Das Myqqli-Modul in PHP ist viel schneller als das pdo-Modul mit MySQL und anderen SQL-Varianten. Ich verstehe die Logik nicht. Zwar bietet pdo den gleichen Funktionsumfang und kann auch andere Datenbankdienste betreiben als SQL, aber wenn es um die Geschwindigkeit/Performance geht, wäre es sinnvoll die Erweiterung Mysqli weiter zu nutzen. PDO wird erst interessant wenn du Dartenbanken wie Oracle, ZendDB oder NoSQL verwendest. Über 95% der Webserver verwenden aber MySQL oder die meisten Webhoster beiten nur MySQL an. Du bekommst bis zu 24% mehr Performance mit vorbereiteten Anweisungen mithilfe von MysQLi als mit PDO. Zudem kannst du sowohl prozedual als auch objektorientiert in MysQLi arbeiten.

    Gruss Localfu
    PS: Wenn euch mein Post gefallen hat, dann lasst mir ein "Daumen hoch" da!

    Kommentar


    • #3
      Zitat von Localfu Beitrag anzeigen
      Du bekommst bis zu 24% mehr Performance mit vorbereiteten Anweisungen mithilfe von MysQLi als mit PDO.
      Genau dass wurde mir in einem anderem Forum andersrum gesagt, daher dachte ich mir dann werde ich wohl mal das ganze umbauen.
      Zudem wird es immer als Einfacher und Schneller als mysqli beschrieben.

      Für das Projekt verwende ich eine MariaDB, hab ich da dann schlechtere oder Bessere Performance, weil irgendwie sagt jeder was anderes?
      Und ist es wirklich einfacher als mysqli oder doch eher schwerer? Weil man überall dazu überredet wird zu pdo zu wechseln?

      Grüße

      Kommentar


      • #4
        Hallo Nightland Driver
        ich habe mich nun endlich auch mal dazu entschieden von mysqli auf pdo umzusteigen.
        Gute Entscheidung und gut, dass Du gleich mit prepared Statements eingestiegen bist.
        bis zu 24% mehr Performance
        Lass dich nicht verunsichern: 24% sind nicht die Welt und die Prozessoren sind sehr schnell heute, so dass solche Gesichtspunkte in den Hintergrund treten. Außerdem erwarte ich, dass bei komplexeren Abfragen auf einen umfangreichen Datenbestand die Arbeit der Datenbank selber den Löwenanteil ausmacht.

        Nun bin ich dabei meine Login Seite wieder ans laufen zu bekommen und da komme ich nicht weiter.
        Woran scheitert es denn konkret?

        Kommentar


        • #5
          Erstmal Danke für deine Antwort,
          Also sollte ich deiner Meinung nach doch zu pdo wechseln.

          Dann würde ich hilfe benötigen bei solchen sachen wie dieser Zeile von oben aus dem Source.
          PHP-Code:
          if(!mysqli_stmt_prepare($stmt$sql)){
          header("Location: $url'danger_sqlerror');
          exit();

          Hier hätte der Login vorhgang unterbrochen wenn beim prepare von mysqli ein fehler aufgetreten wäre, dafür konnte ich bis jetzt nicht für pdo finden und da es feste mit in der alten struktur drin war würde die gesamte Abfrage nicht mehr funktionieren.

          Zitat von Sempervivum Beitrag anzeigen
          Lass dich nicht verunsichern: 24% sind nicht die Welt und die Prozessoren sind sehr schnell heute, so dass solche Gesichtspunkte in den Hintergrund treten. Außerdem erwarte ich, dass bei komplexeren Abfragen auf einen umfangreichen Datenbestand die Arbeit der Datenbank selber den Löwenanteil ausmacht.
          Es geht mir in erster Linie um die Einfachheit und übersichtlichkeit des Codes. Die ganzen Abfragen sind nur für das Dashboard der Seite, wo nur wenige Personen zugriff drauf haben.
          Daher spielt die schnelligkeit keine große Rolle.

          Kommentar


          • #6
            Bei dieser speziellen Aufgabe hilft das Handbuch:
            https://www.php.net/manual/de/pdostatement.execute.php
            Rückgabewerte
            Gibt bei Erfolg true zurück. Im Fehlerfall wird false zurückgegeben.
            D. h. der Rückgabewert zeigt an, ob die Abfrage erfolgreich ausgeführt werden konnte.

            Kommentar


            • #7
              Zitat von Nightland Driver Beitrag anzeigen

              Genau dass wurde mir in einem anderem Forum andersrum gesagt, daher dachte ich mir dann werde ich wohl mal das ganze umbauen.
              Dazu https://medium.com/@haseeb.basil/mys...n-37a9c2ec8d49
              Denke mal daran wie Tests gemacht werden. Zum Beispiel Handybatterie. Testresultat vs Realität.
              https://arnego2.com <Webseiten, Umbau ab €80 und einiges mehr>

              VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €38

              Kommentar


              • #8
                Ok, dann stelle ich mir jetzt aber die Frage ob es dann überhaupt sinnvoll ist alle ca 500 mysqli code abschnitte auf pdo umzuschreiben, wenn es nicht wirklich was bringt und auch keinen wirklich merkbaren unterschied macht.

                Kommentar


                • #9
                  ca 500 mysqli code abschnitte
                  Das ist jetzt ein ganz anderer Gesichtspunkt, in dem Fall würde ich auch darauf verzichten und PDO nur bei Neuentwicklungen verwenden.

                  Kommentar


                  • #10
                    Zitat von Nightland Driver Beitrag anzeigen

                    Ok, dann stelle ich mir jetzt aber die Frage ob es dann überhaupt sinnvoll ist alle ca 500 mysqli code abschnitte auf pdo umzuschreiben, wenn es nicht wirklich was bringt und auch keinen wirklich merkbaren unterschied macht.
                    Ich würd es nicht machen.
                    https://arnego2.com <Webseiten, Umbau ab €80 und einiges mehr>

                    VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €38

                    Kommentar


                    • #11
                      Gut, dann hat sich dieses Thema erledigt, danke für die Hilfreichen Antworten, dann belasse ich es bei mysqli für dieses Projekt.

                      Kommentar


                      • #12
                        Hiho,
                        ich wollte nicht damit verunsichern oder PDO schlecht machen. Es gibt Vor- und Nachteile bei der Benutzung unterschiedlicher PHP-Module. MysQLi bietet fast alle Möglichkeiten wie PDO es tut. Es MysQLi bietet den schnelleren Einstieg, da es sowohl die möglichkeit gibt prozedual den zu arbeiten als auch objektorientiert. Du solltest trotzdem lernen bei Varianten zu beherschen, um zu schauen wo es Unterschiede gibt. Inhalte zu diesem Thema in Foren: Also in vielen Foren stehen unterschiedliche Meinungen was schneller bzw. performanter arbeitet. Am Ende zählen aber nur die Benchmark-Test. Diese sind ausschlag gebend, wenn es um Performance geht. Aber Geschwindigkeit ist nicht immer alles was zählt. Es kommt auch auf die Praxis an. Man muss auch nicht die Seite vom Bäcker nebenan hochperformant erstellen, da es unwahrscheinlich ist, dass der Webserver voll ausgelstatet ist. XD

                        PS: Prepared Statements: Diese erhöhen die Sicherheit ungemein und bieten noch andere Vorteile.

                        Gruss Localfu
                        PS: Wenn euch mein Post gefallen hat, dann lasst mir ein "Daumen hoch" da!

                        Kommentar


                        • #13
                          Zitat von Nightland Driver Beitrag anzeigen

                          alle ca 500 mysqli code abschnitte auf pdo umzuschreiben...
                          Boah, das ist 'ne Menge Holz. Schon mal überlegt anstelle jeden SQL-Aufruf zu coden mit Templates und include zu arbeiten?
                          Da reicht dann ein Tepmplate für 'einloggen', 'anlegen', 'einfügen', 'löschen' und 'suchen'. Diese Templates mit den entwpechenden Variablen füttern und rd. 90% typischer db-Aufgaben wären damit erledigt.

                          Größter Vorteil: Absolut überschaubarer Wartungsaufwand (z.B. auf Umstellung auf pdo...)

                          Kommentar


                          • #14
                            Ja ich habe schon überlegt dass zu machen, denke sobald alles so läuft wie ich das gerne hätte werde ich das ganze ding mal auseinander basteln und dann neu strukturieren. Muss dann sowieso nochmal durch alle Datein und da aufräumen.

                            Kommentar


                            • #15
                              Ich habe mich jetzt mal damit ein wenig auseinander gesetzt und auch schon etwas was in die richtung geht hoffe ich, aber das funktioniert noch nicht so ganz, ich habe mal mit einem einfachen einfügen von einem neuen Wert in die Datenbank angefangen. nur jetzt bekomme ich den Fehler: "mysqli_stmt_bind_param(): Number of elements in type definition string doesn't match number of bind variables". Ich habe nichts geändert, habe nur die werte in eine Variable gepackt und die sql genereller gefasst.

                              Hier die Aktuelle Abfrage und meine Variablen bei der übergabe:
                              PHP-Code:
                              <?php
                              //Create / Insert SQL
                              $sql "INSERT INTO " $db_table " (" $db_colums ") VALUES (" $db_colums_num ")";
                              $stmt mysqli_stmt_init($conn);
                              if(!
                              mysqli_stmt_prepare($stmt$sql)){
                              header("Location: $url'danger_sqlerror');
                              //exit();
                              }
                              else {
                              mysqli_stmt_bind_param($stmt'"' $db_colums_type '"'$db_colums_var);
                              mysqli_stmt_execute($stmt);

                              /*echo $db_table . '<br/>';
                              echo $db_colums . '<br/>';
                              echo $db_colums_num . '<br/>';
                              echo '"' . $db_colums_type . '"' . '<br/>';
                              echo $db_colums_var . '<br/>';*/

                              $loc $location;
                              $act $action;
                              $sql "INSERT INTO last_activity (user_id, action, location) VALUES ('" $_COOKIE['userId'] . "','" $act "','" $loc "')";
                              $query mysqli_query($conn,$sql);
                              mysqli_close($conn);

                              header("Location: $url'success_create');
                              //exit();
                              }
                              PHP-Code:
                              <?php
                              require_once "dbh.inc.php";
                              $url '../manage_article.php?a=';

                              $author $_COOKIE['userName'];
                              $title $_POST['articleTitle'];
                              $text $_POST['articleText'];
                              $createddate date("Y-m-d");
                              $editeddate date("Y-m-d");

                              if(empty(
                              $title) || empty($text)) {
                              header("Location: $url'info_empty');
                              exit();
                              }
                              else {
                              $db_table "article";
                              $db_colums "author, title, text, created, edited";
                              $db_colums_num "?, ?, ?, ?, ?";
                              $db_colums_type "sssss";
                              $db_colums_var "$author$title$text$createddate$editeddate";

                              $location "article";
                              $action 0;

                              include(
                              'sql/create_sql.php');

                              /*
                              $sql = "INSERT INTO article (author, title, text, created, edited) VALUES (?, ?, ?, ?, ?)";
                              $stmt = mysqli_stmt_init($conn);
                              if(!mysqli_stmt_prepare($stmt, $sql)){
                              header("Location: $url" . 'danger_sqlerror');
                              exit();
                              }
                              else {
                              mysqli_stmt_bind_param($stmt, "sssss", $author, $title, $text, $createddate, $editeddate);
                              mysqli_stmt_execute($stmt);

                              $loc = "article";
                              $act = 0;
                              $sql = "INSERT INTO last_activity (user_id, action, location) VALUES ('" . $_COOKIE['userId'] . "','" . $act . "','" . $loc . "')";
                              $query = mysqli_query($conn,$sql);
                              mysqli_close($conn);

                              header("Location: $url" . 'success_create');
                              exit();
                              }
                              */
                              }
                              mysqli_stmt_close($stmt);
                              mysqli_close($conn);

                              Kommentar

                              homepage-forum.de - Hilfe für Webmaster! Statistiken

                              Einklappen

                              Themen: 56.802   Beiträge: 430.056   Mitglieder: 28.555   Aktive Mitglieder: 54
                              Willkommen an unser neuestes Mitglied, Fohlenfan.

                              Online-Benutzer

                              Einklappen

                              224 Benutzer sind jetzt online. Registrierte Benutzer: 5, Gäste: 219.

                              Mit 3.502 Benutzern waren am 23.01.2020 um 18:20 die meisten Benutzer gleichzeitig online.

                              Die neuesten Themen

                              Einklappen

                              Die neuesten Beiträge

                              Einklappen

                              Lädt...
                              X