Nach update auf php 8 ein Fehler im Code

JuSeCo

Grünschnabel
Hey Leute,

ich habe mit dem PHP update ein Fehler der an mehreren Stellen auftritt und konnte leider nichts finden was sich geändert hat. Bzw was ich gefunden habe, habe ich nicht wirklich verstanden, da ich nicht so erfahren bin was diesen Bereich angeht.

Fehler ist:

Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in ....


Der Betreffende Code abschnitt ist:

$statement = $pdo->prepare("SELECT ueber_kat, unter_kat FROM de_ger_kat_branchen");
$result = $statement->execute(array(':ueber_kat' => "ueber_kat", ':unter_kat' => "unter_kat"));

in früheren Versionen klappte es ohne Probleme.

MFG JuSeCo

EDIT: Wo kann ich inzwischen den Code markieren?
 

JuSeCo

Grünschnabel
Erstmal Vielen Dank für die Rückmeldung.

Diese Seite und eben dieses Bsp. hatte ich mir auch angesehen bei meiner Lösungssuche und es brachte mich nicht weiter.
Der Grund ist, das Sie in dem bsp. eine Variable nutzen die Sie zuvor oben deklariert haben.

In meinem Fall gibt es diese nicht. Was ich mit dem Script mache ist folgendes (sicher kann man es besser machen)


Die Db hat in der ersten Spalte oft den selben Inhalt, die 2te ist selten doppelt.

In der DB ist es als bsp:


Spalte 1 Spalte 2

Freizeit Sport
Freizeit Fitness
Arbeit Nervt


Im Anschluss habe ich ein Dropdown wo ich die Einträge von Spalte 1 Anzeigen lasse, jedoch nicht doppelt und im 2ten Dropdown werden nur die zugehörigen angezeigt und mittels JS neu abgerufen.


Also mein Gedanke war, dass ich alle Daten aus der DB in das Array nehme ohne Vorbestimmung und die dann Später sortiere. (sind nur begrenzte Einträge max 57 Zeilen).

So wie ich dich jetzt verstanden habe ist, dass meine Art nun nicht mehr geht und ich es mit Platzhaltern Lösen muss. So habe ich nun etwas wonach ich weiter suchen kann, leider sind bei meiner suche sehr viele Einträge nicht auf php8 so das ich oft das Ergebnis finde wie ich es bisher gemacht habe.

LG JuSeCo
 

Sempervivum

Erfahrenes Mitglied
dass meine Art nun nicht mehr geht und ich es mit Platzhaltern Lösen muss.
Nicht unbedingt, der Hinweis auf das Beispiel #2 sollte nur die Fehlermeldung erklären. Wenn ich mir dein PHP aus dem ersten Posting ansehe, willst Du einfach alle Zeilen aus der Datenbank abfragen, ohne where-Klausel o. ä. In dem Fall brauchst Du gar keine Platzhalter und kannst die Abfrage direkt ausführen durch Aufruf von query:
PHP: PDO::query - Manual

Im Anschluss habe ich ein Dropdown wo ich die Einträge von Spalte 1 Anzeigen lasse, jedoch nicht doppelt und im 2ten Dropdown werden nur die zugehörigen angezeigt und mittels JS neu abgerufen.
Ich vermute, dass Du das mit einer Nachbearbeitung realisierst. Dafür gibt es eine Alternative, nämlich das Ergebnis der Abfrage durch PDO nach der ersten Spalte gruppieren zu lassen, so wie hier unter fetch_style und in Beispiel #3 beschrieben:
PHP: PDOStatement::fetchAll - Manual
To return an associative array grouped by the values of a specified column, bitwise-OR PDO::FETCH_COLUMN with PDO::FETCH_GROUP.
 

JuSeCo

Grünschnabel
Danke für die schnelle Rückmeldung.

Ich werde mir nun deine Links nochmal genau ansehen und meinen Code überarbeiten.

Wie gesagt ich bin recht unerfahren und froh wenn irgendwas klappt.

Mich wunderte das dieser Code mir einen Fehler ausgibt:

PHP:
$statement = $pdo->prepare("SELECT * FROM de_ger_kat_branchen");
$result = $statement->execute(array(':ueber_kat' => "ueber_kat", ':unter_kat' => "unter_kat"));
 $kat = $statement->fetchAll(PDO::FETCH_ASSOC);

Dieser jedoch nicht:
PHP:
        $stmt = $pdo->prepare('SELECT * FROM unternehmen_kontakt WHERE ok = :ok OR ok = :uk'); 
        $stmt->execute(array(':ok' => 'Essen&Trinken', ':uk' => 'Sport&Freizeit'));
        $kat = $stmt->fetchAll(PDO::FETCH_ASSOC);

Das ganze Script ist dieses, dabei hat mich schon immer gestört das ich 2 mal die DB abfrage aber es funktionierte daher habe ich es gelassen.

PHP:
                    $statement = $pdo->prepare("SELECT * FROM de_ger_kat_branchen");
                       $result = $statement->execute(array(':ueber_kat' => "ueber_kat", ':unter_kat' => "unter_kat"));
                    $kat = $statement->fetchAll(PDO::FETCH_ASSOC);
                    
                    

                    #print_r($kat);

                     foreach ($kat as $value) {
                        $group[$value['ueber_kat']] = $value;
                    }
                    
                    echo "<select name=ok id=ueberkat >";
                                echo "<option value=err>Bitte wählen...</option>";
                                foreach($group as $row) {    
                                    echo "<option value=".str_replace(" ", "", $row['ueber_kat']).">".$row['ueber_kat']."</option>";
                                }
                    echo "</select>";                
                    

                    foreach($group as $row['ueber_kat'] => $ss) {
                            
                        $statement = $pdo->prepare("SELECT * FROM de_ger_kat_branchen WHERE ueber_kat = :ueber_kat ");
                        $statement->execute(array(':ueber_kat' => $row['ueber_kat']));
                            echo "<select name=uk style=display:none;  class=unterkat onChange=guk(this); id=unterkat-".str_replace(" ", "", $row['ueber_kat']).">";
                            echo "<option value=err>Bitte wählen...</option>"; 
                                while($row = $statement->fetch()) {
                                    echo "<option value=".$row['unter_kat'].">".$row['unter_kat']."</option>"; 

                                }
                            echo "</select>";
                        }
                        
                        
                        
                    ?>
<script type="text/javascript">
function guk(obj)
{
    var x = obj.options[obj.selectedIndex].text ;
    
    document.new_firma.h_uk.value= x;
    
}
</script>
<input type="hidden" name="h_uk" value=""  />


Das hidden Feld am ende hatte ich hier eingebaut um den Wert aus Dropdown 2 in der DB zu speichern, das habe ich anders überhaupt nicht hinbekommen.

Danke jedenfalls für die 2 Links, ich bin nun erstmal ne ganze Weile damit beschäftigt.

LG JuSeCo
 

Sempervivum

Erfahrenes Mitglied
Dann viel Erfolg beim Durcharbeiten und melde dich, wenn es Problem beim Verständnis oder der Umsetzung gibt.