Umstellung von mysqli auf pdo - Funktion umbauen

Sempervivum

Erfahrenes Mitglied
Auf dieses Problem bin ich früher schon mal gestoßen. Ich versuche, eine Lösung zu skizzieren ohne sie zu testen:
AFAIK müssen die Platzhalter beim "IN" so aussehen:
Code:
IN (:param1,:param2,:param3)
wobei ich davon ausgehe, dass die Anzahl variabel ist.
Den String in den Klammern kannst Du z. B. so erzeugen:
Code:
$placeholders = '';
for ($nr = 1; $nr <= count($kategorienTradeinBeachten); $nr++) {
    if ($nr >1) {
        $placeholders .= ', ';
    $placeholders .= ':param' . $nr;
}
(Man könnte auch eine Verkettung von range, map und implode nehmen, wäre aber IMO unübersichtlicher).
Das Ergebnis kannst Du dann in deine Query einsetzen:
Code:
IN ($placeholders, 'sammel')

Das Array für die Werte kannst Du dann ähnlich erzeugen:
Code:
$values = [':userid' => $userid, ':set' => $set, ':nummer' => $nummer];
for ($nr = 1; $nr <= count($kategorienTradeinBeachten); $nr++) {
    $values[':param' . $nr] = $kategorienTradeinBeachten[$nr - 1];
}
Jetzt, wo ich das soweit geschrieben habe, fällt mir auf, dass man beides natürlich in einer Schleife erledigen könnte. Das kannst Du selbst noch ändern.
Und am besten alles in eine Funktion packen, damit Du es für andere Queries wieder verwenden kannst.
Wenn man auf Parameter mit Namen verzichten würde, wäre es einfacher aber schlechter lesbar.
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Ich habe es jetzt noch mit einer Funktion getestet und dies funktioniert:
Code:
$actors = ['Bria Senussi', 'Salvador Meni', 'Brose Robberts'];
function makeParams($valuesIn, $name, &$placeholders, &$valuesOut)
{
    for ($nr = 1; $nr <= count($valuesIn); $nr++) {
        if ($nr > 1) {
            $placeholders .= ', ';
        }
        $placeholders .= ':' . $name . $nr;
        $valuesOut[$name . $nr] = $valuesIn[$nr - 1];
    }
}
makeParams($actors, 'actor', $placeholders, $values);
var_dump($placeholders);
var_dump($values);
$query = "SELECT * FROM actor WHERE actor in ($placeholders)";
var_dump($query);
$stmt = $pdo->prepare($query);
$result = $stmt->execute($values);
var_dump($result);
var_dump($stmt->fetchAll());
 

Dragosius

Erfahrenes Mitglied
Hallo,

ich wollte nur nochmal kurz Bescheid geben, dass ich es nun geschafft habe, mein komplettes Projekt von mysqli auf pdo umzustellen.

Vielen Dank
 

Dragosius

Erfahrenes Mitglied
Ich habe es ehrlich gesagt teilweise etwas anders gelöst, da es sich stellenweise einfach um 3 feste Werte handelte.
Da brauche ich nicht so eine große Funktion.

Wie kann ich denn folgende Abfrage in pdo umsetzen?
Code:
pdoQuery("UPDATE `mitglieder` SET `yummies` = `yummies` - :yummies WHERE `id` = :id", [':yummies'=>$betrag, ':id'=>$werId]);
Meine Implementierung scheint hier nicht zu funktionieren.
Es handelt sich dabei um Zahlen, darum die Subtraktion.

Bei dem Feld handelt es sich um eine Zahl und ich möchte einfach vom vorhandenen Wert etwas abziehen und es wieder speichern.
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Hm, ich habe diesen Code selber mal getestet, natürlich mit anderen Feld- und Variablennamen und er hat einwandfrei funktioniert. Passen denn die Typen, d. h. ist $betrag auch numerisch?
Mal mit var_dump ausgeben lassen und die Fehlermeldungen für SQL einschalten, ob Du dadurch Hinweise bekommst.
 

Zvoni

Erfahrenes Mitglied
Und benutz andere Bezeichner für die Parameter.

Jedesmal wenn ich sowas sehe wie "blablablabla ... SET EinFeld=EinFeld - :EinFeld ......" stellen sich mir die Nackenhaare auf.
Vertippe dich einmal beim Doppelpunkt.......
Parameternamen sind bei mir immer Bezeichner welche definitiv nicht als Spaltenname in der Tabelle/Datenbank vorkommen.

Stimme Semper zu: Würde erstmal Inhalt und Datentyp von $betrag und $WerID prüfen, dann was im SQL ankommt.

Ausserdem war ich der Meinung, dass Parameter in MySQL mit einem @ vorangestellt werden, und nicht mit Doppelpunkt
 
Zuletzt bearbeitet: