• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Pdo

Tanja

Neues Mitglied
meine ersten Gehversuche mit PDO - Fragen über Fragen ;-)

folgendes INSERT funktioniert einwandfrei:
Code:
try {
  // Connect and create the PDO object
  $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
  // Define an insert query
 $sql = "INSERT INTO `dogtest`
            (`dogname`,
            `gender`,
            `father_id`) 
            
            VALUES (
            ?, ?, ?)";
                                          
$stmt = $conn->prepare($sql);
$stmt->bindParam(1, $welpe1); 
$stmt->bindParam(2, $welpegeschlecht1); 
$stmt->bindParam(3, $maleid);  
                                                                             
$stmt->execute(); 
  $count = $conn->exec($sql);

  $conn = null;        // Disconnect
}

  catch(PDOException $e) {
  echo $e->getMessage();
  
}

ist aber hier mal stark gekürzt.
Damit schenke ich mir jetzt mysql_real_escape_string und was noch?
Dieses Insert muss unter Umständen bis zu zehnmal eingefügt werden (wobei sich dann jeweils 5 von 10 Variablen ändern). In althergebrachter Weise habe ich das mit einer if-Abfrage gelöst
PHP:
if (!empty($welpename2))
 {
$sql =" 
INSERT INTO dog (species, dogname, gender, father_id)
  VALUES
 ('3', '$welpename1', '$welpegeschlecht1', '$vater'),
 ('3', '$welpename2', '$welpegeschlecht2', '$vater');    
";
}
und so fortlaufend für 3-10.
Müsste ich jetzt für das PDO-Insert jedesmal jede Variable einzeln erneut aufzählen?
 
Werbung:
Moin,
wenn du mit named params arbeitest, brauchst du nicht für jeden Datensatz ein bindParam.

PHP:
$stmt = $conn->prepare("INSERT INTO `dogtest` 
    (`dogname`, `gender`, `father_id`) 
    VALUES (:dogname, :gender, :father_id)");

$doggies = array(
  array('dogname' => $welpename1, 'gender' => $welpegeschlecht1, 'father_id' => $vater),
  array('dogname' => $welpename2, 'gender' => $welpegeschlecht2, 'father_id' => $vater)
);

foreach($doggies as &$dog) {
  $stmt->execute($dog);
}

Ungetestet, aber sollte so gehen

PHP: PDOStatement::execute - Manual

MfG
 
ok, sieht gut aus ...
Welche Variante (mit ? oder named) ist die bessere - oder völlig wurscht?

Das Insert wird korrekt ausgeführt, aber ich erhalte folgende Meldung:
Code:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an  error in your SQL syntax; check the manual that corresponds to your  MySQL server version for the right syntax to use near '?, ?, ?)' at line  7
 
Zuletzt bearbeitet:
Werbung:
Keine Variante ist besser; es kommt auf den Anwendungsfall an. Generell sind genannte Parameter klarer und es muss nicht auf die Reihenfolge geachtet werden.

Der SQL-Fehler kommt bestimmt davon, dass du query() und nicht prepare() benutzt.
 
Zurück
Oben