Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP:PDO Array speichern

Einklappen

Neue Werbung 2019

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

  • PHP:PDO Array speichern

    Hallo, kann mir jemand einen Rat geben, ich versuche gerade PDO Query auszuführen.
    Die Tabelle soll so aussehen.

    status | array_werte
    1 | 1
    1 | 2
    1 | 3
    1 | 4
    1 | 5


    Mein Code

    PHP-Code:

    $status 
    '5';

    $array = [1,2,3,4,5];

    # Dieses Beispiel funktioniert nicht.
    $save_data "INSERT INTO table (status, array_values) VALUES (:status, :array)";
    $stmt->bindParam(':status'$status);
    $stmt->bindParam(':array'$array);
    return 
    $stmt->execute();


    # Dieses Beispiel funktioniert nicht
    $save_data "INSERT INTO table (status, array_values) VALUES (:status, :array)";
    foreach(
    $array as $value){
        
    $stmt->bindParam(':status'$status);
        
    $stmt->bindParam(':array'$value);
        return 
    $stmt->execute();
    }


    # Dieses Beispiel funktioniert aber sieht merkwürdig aus.

    foreach($array as $value){
    $save_data "INSERT INTO table (status, array_values) VALUES (:status, :array)";
        
    $stmt->bindParam(':status'$status);
        
    $stmt->bindParam(':array'$value);
        return 
    $stmt->execute();

    Hat jemand einen Idee?

  • #2
    Multiple Inserts sehen anders aus.
    In den ersten beiden sind die Werte nicht SQL-konform aufgebaut und das letzte funktioniert nur, weil Du für jeden einzelnen Datensatz ein eigenes INSERT verwendest.

    Ich würde an der Stelle die Daten schon vorher aufbauen:
    PHP-Code:
    $array implode'),('$array );
    $save_data "INSERT INTO table (status, array_values) VALUES (" $array ")"
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Vielen Dank, aber wohin soll status rein? Ich habe vergessen prepare($sql) einzufügen, ich möchte "prepared statements" verwenden.

      Kommentar


      • #4
        Da LAST_INSERT_ID() in MySQL bei einem Multi-Insert nur den letzten Wert zurückgibt. Auch führt ein Multi-Insert bei MyISAM den Query teilweise aus, wenn es zu einem Fehler kommt. Darum besser einzelne Queries in einer Transaktion (mit InnoDB) durchführen. Mit einzelnen Queries ist es dann auch einfacher zu prüfen welche Queries funktioniert haben und welche nicht.

        Kommentar


        • #5
          Es ist richtig was Blar ausführt. Einziger Nachteil ist das ein Insert großer Arrays viel Zeit benötigen kann. Ein Multi-Insert ist da sehr viel schneller. Arne Drews hat das angedeutet. Um vor einer SQL-Injektion sicher zu sein, müssen die Werte jedoch noch manuell gequotet werden, wenn nicht mit Prepared Statements gearbeitet wird. Ich setze hier mal nur für das Verständnis dafür eine Methode rein, mit der ich schon länger arbeite:
          PHP-Code:
          /*
          * Füllt Tabelle mit Feldnamen aus den Schlüsseln des $arr
          * $arr = array(array('feld1' => value, 'feld2' => value))
          * return: Anzahl der eingefügten Datensätze, false if Error
          * Beispiel:
          * $inserts = array(
          * array('name' => 'uwe','id' => 6 , 'datum' => '2001-05-27 04:00:00'),
          * );
          * $insertCount = $db->insertAll('userlogin',$inserts);
          */
          public function insertAll($tableName,$arr){
          if(empty(
          $arr)) return 0;
          if(!
          is_array($arr) OR !is_array(reset($arr))) {
          $this->errorHandling('Error in '.__FUNCTION__.': 2.Param is not a 2 dim.Array');
          return 
          false;
          }
          $sql "INSERT INTO ".$this->quoteIdentifiers($tableName).
          " (".$this->quoteIdentifiers(array_keys($arr[0])).") ".
          " VALUES ";
          foreach(
          $arr as $row) {
          $row array_map('self::escQuote'$row);
          $sql .= "(".implode(",",$row)."),";
          }
          $sql rtrim($sql,',');
          $this->sql $sql;
          $r $this->exec($sql);
          return 
          $r;

          LG jspit

          Kommentar


          • #6
            Vielen Dank an alle!
            Hier ist die Lösung

            PHP-Code:
            $sql 'INSERT INTO table (memberID, programID) VALUES ';
            $insertQuery = array();
            $insertData = array();
            foreach (
            $data as $row) {
                
            $insertQuery[] = '(?, ?)';
                
            $insertData[] = $memberid;
                
            $insertData[] = $row;
            }

            if (!empty(
            $insertQuery)) {
                
            $sql .= implode(', '$insertQuery);
                
            $stmt $db->prepare($sql);
                
            $stmt->execute($insertData);

            https://stackoverflow.com/questions/...-w-php-and-pdo

            Kommentar


            • #7
              Bei den Fragezeichen muss man sehr auf die Reihenfolge achten, ich würde hier auf benannte Platzhalter zurückgreifen, Bei 2 Werten mag das noch gehen, wenn es mehr werden kommt man da schnell ins Grübeln.
              Gerade PDO bietet da einen enormen Vorteil ggü mysqli, welche so etwas nicht kennt.

              Kommentar


              • #8
                Benannte Platzhalter sind für die Lösung #6 fehl am Platz. Das wird sofort sichtbar, wenn das erzeugte SQL mal für ein konkrete Daten ausgegeben wird:
                Code:
                INSERT INTO table (memberID, programID) VALUES (?, ?), (?, ?), (?, ?), (?, ?), (?, ?)
                LG jspit

                Kommentar

                Lädt...
                X