Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MYSQLi - pre-stmt - Insert... Values(?) ?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] MYSQLi - pre-stmt - Insert... Values(?) ?

    Hallo,
    ich habe versucht mit prepared statements eine Abfrage mit beliebig vielen Spalten zu erzeugen. Das heißt, dass ich mit Insert into `table` VALUES(?) versuche da eine beliebige Anzahl an Werten einzutragen, damit ich diese Query für alle Tabellen allgemeingültig machen kann.
    Ich kriege die Fehlermeldung, dass ich eine andere Anzahl an Werten eintrage als es Spalten gibt.
    Hier der Code:

    PHP-Code:
    $mysqli= new mysqli
                
    (
                    
    $_SESSION["sql_host"], 
                    
    $_SESSION["sql_user"], 
                    
    $_SESSION["sql_pw"],
                    
    $_SESSION["sql_db_open"]
                )or die(
    'konnte keine Verbindung herstellen');
            
    $query  "INSERT INTO $tabelle VALUES(?)";
            
    $result $mysqli -> prepare($query)
                or die(
    $mysqli->error);
            
            
    $stmt   -> bind_param('ss'$tabelle$werte);
            
    $stmt   -> execute()
                or die (
    'Es ist ein fehler aufgetreten!');
        } 
    Heißt das, dass das als nur ein Wert interpretiert wird? Das würde einen prepared statement an der Stelle so ja beinah unmöglich machen.

    Als Hintergrund...
    Ich versuche durch ein formular auf meiner Webseite die Werte in das Script zu übertragen und diese als Aufzählung in diese Query einzufügen. Das sieht dann z.b. so aus:
    '1', 'abc', 'wrt', '3', '2'
    Ich hab aber nachgesehen, es sind immer gleich viele Werte wie Spalten, habt ihr noch eine Idee?


  • #2
    Du kannst Tabellen- und Feldnamen nicht dynamisch binden (nicht per bind_param()).

    Beim Aufruf von prepare() müssen Tabellen- und Feldnamen bekannt sein, denn der Datenbanktreiber muss feststellen können, mit welchen Datentypen er es zu tun hat, dazu benötigt er diese Infos.
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      hm.... sowas hab ich mir schon gedacht. Also muss ich was basteln, was das trotzdem dynamisch macht. Zum einen ist da die Query. Die krieg ich dynamisch, aber die bind-Funktion? Hat da jemand eine Idee? Notfalls muss ich es ohne prepared statements machen aber ich wollte die sicherheit schon drin haben.

      Kommentar


      • #4
        Mit PDO könnte man sowas machen:
        PHP-Code:
        function insertInto(PDO $pdo$tableName, array $valuesToInsert){
            
        $placeHolderString '';
            
        $columnString '';
            
        $values = array();
            foreach(
        $valuesToInsert as $column => $value){
                
        $values[] = $value;
                
        $columnString .= '`' $column '`, ';
                
        $placeHolderString .= '?, ';
            }
            
        $columnString substr($columnString0, -2);
            
        $placeHolderString substr($placeHolderString0, -2);
            
        $statement $pdo->prepare('INSERT INTO ' $tableName .' (' $columnString ') VALUES ('$placeHolderString .')');
            
        $statement->execute($values);
        }
        $pdo = new PDO('mysql:host='.$HOST.';dbname='.$BASE.';charset='.$CHAR.';'$USER$PASS);
        $values = array('Item' => 'Handschuh''Effekt' => 'Hält im Winter warm''Position' => 'Hand''Kosten' => 400);
        insertInto($pdo'Ausruestung'$values); 
        Ob so etwas sinnvoll ist... keine Ahnung, aber vielleicht kriegst du das ein bisschen verschönert, dann würde ich bei meinen kleineren Freizeitprojekten sogar drüber nachdenken die Funktion zu nutzen.
        Relax, you're doing fine.
        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

        Kommentar

        Lädt...
        X