Umstellung von mysqli auf pdo - Funktion umbauen

Dragosius

Erfahrenes Mitglied
Hallo,

ich möchte gerne ein Projekt von mysqli auf pdo umstellen.

In mysqli verwende ich momentan folgende Funktion, um die Abfragen durchzuführen:
PHP:
function sqlQuery($query, $keineNachricht = false) {
    global $db_link;
    $res = mysqli_query($db_link, $query);
    if (mysqli_error($db_link)) {
        global $webbyId;
        nachricht($webbyId, $webbyId, 'Abfrage fehlgeschlagen', $query.' -> '.mysqli_error($db_link), true);
        return false;
    }
    if (!$res && !$keineNachricht) {
        global $webbyId;
        nachricht($webbyId, $webbyId, 'Abfrage ohne Ergebnis', $query, true);
    }
    return $res;
}
Hier erhalte ich bei jeder fehlgeschlagener Abfrage eine Nachricht (E-Mail).

Ich möchte pdo gerne mit benannten Parametern verwenden.
z.B.
PHP:
$statement = $pdo->prepare("SELECT * FROM users LIMIT :limit");
$statement->bindParam('limit', $limit, PDO::PARAM_INT);
$statement->execute();

Gibt es da eine Möglichkeit, eine Funktion dieser Art auch für pdo zu erstellen?
 
Ich möchte eine zentrale Funktion haben, in der ich auch die Logik habe, dass ich Nachrichten bei fehlgeschlagenen Abfragen bekomme.
Dieser Funktion sollen immer die SQL-Abfragen übergeben werden.
Nur mit den Statements wird das ja etwas komplexer oder denke ich hier gerade zu kompliziert?
 
Für die Umstellung auf PDO müsstest Du nur ein Array mit den Parametern zusätzlich übergeben:
Code:
function sqlQuery($query, $params, $keineNachricht = false) {
    global $pdo;
    $statement = $pdo->prepare($query);
    $statement->execute($params);
    if ($statement === false) {
        global $webbyId;
        nachricht($webbyId, $webbyId, 'Abfrage fehlgeschlagen', $query.' -> '.mysqli_error($db_link), true);
        return false;
    }
    $res = $statement->fetchAll();
    if (count($res) == 0 && !$keineNachricht) {
        global $webbyId;
        nachricht($webbyId, $webbyId, 'Abfrage ohne Ergebnis', $query, true);
    }
    return $res;
}
Aufruf dann:
Code:
sqlQuery("SELECT * FROM users LIMIT :limit", [':limit'=>$limit]);
Alles ungetestet.
 
Mit der Umstellung von mysqli_error sieht es bei mir nun so aus:
PHP:
function sqlQuery($query, $params, $keineNachricht = false) {
    global $pdo;
    $statement = $pdo->prepare($query);
    $statement->execute($params);
    if (!$statement->execute()) {
        global $webbyId;
        nachricht($webbyId, $webbyId, 'Abfrage fehlgeschlagen', $query.', ' . $params . ' -> ' . print_r($statement->errorInfo()), true);
        return false;
    }

    $res = $statement->fetchAll();
    if (count($res) == 0 && !$keineNachricht) {
        global $webbyId;
        nachricht($webbyId, $webbyId, 'Abfrage ohne Ergebnis', $query, true);
    }
    return $res;
}

Nur wie kann ich da die Filter mit übergeben?
z.B.
Code:
PDO::PARAM_INT
 
Zuletzt bearbeitet:
Bisher habe ich diese Angabe des Typs nicht gebraucht sondern nur ein Array mit Name und Wert an execute übergeben. Und ich habe es so verstanden, dass PDO den Parameter automatisch auf Grund seines Typs richtig verarbeitet. Aber da bin ich mir jetzt nicht sicher, vielleicht kann das jemand mit erweiterten Kenntnissen beurteilen.
Was auf jeden Fall funktionieren würde ist, den Typ mit in das Parameter-Array zu übernehmen:
Code:
[['name'=>':limit', 'value'=>$limit, 'type'=>PDO::PARAM_INT], [/* hier ggf. weitere Params */]]
und dann die Parameter in der Funktion in einer Schleife mit bindParam zu binden.
Aber fraglich ob das unbedingt erforderlich ist.
 
Zuletzt bearbeitet:
"Kein Parameter" sollte funktionieren.
Zwei Parameter müsste so aussehen (da war eine schließende Klammer zu viel):
Code:
sqlQuery("SELECT * FROM users WHERE id = :id LIMIT :limit", [':id'=>$id, ':limit'=>$limit]);
d. h. als zweiten Parameter musst ein Array übergeben.
 
Zuletzt bearbeitet:
Vielen Dank!

Bei der Umstellung bin ich leider wieder auf eine Abfrage gestoßen, bei der ich nicht genau weiß, wie ich die in PDO umsetzen soll:
PHP:
SELECT `user_id`,`setname`,`nummer`,`status`,COUNT(*) AS `anzahl` FROM `kartenvergabe` WHERE `user_id` = $userId AND `setname` = '".$set."' AND `nummer` = '".$nummer."' AND `status` IN('".implode("','", $kategorienTradeinBeachten)."','sammel')

Wie kann ich denn die gleiche Funktionsweise weiterhin nutzen?
 

Neue Beiträge

Zurück