2016-09-09 1 views
1

Je rencontre des problèmes lors de l'insertion de données dans le tableau MySql. Pour simplifier, ma base de données a 2 tables, foo & foo2.Citations imbriquées lors de la saisie dans MySQL

Table foo2 a deux enregistrements

id=1, code="N", desc="Normal" 

id=2, code="D", desc="Deviate" 

Je veux remplir foo mais je dois foo2 référence à le faire. Mon code actuel est:

$inputarray = array(
array("ONE", "Proj 1", "N"), 
array("TWO", "Proj 2", "D")); 

for ($i = 0; $i < count($inputarray); $i++) { 
$sql3 = $pdo->prepare("INSERT INTO foo (var1, var2, var3) 
     VALUES ('{$inputarray[$i][0]}' 
      ,'{$inputarray[$i][1]}' 
      , (select id from foo2 where code='($inputarray[$i][3])') 
         )"); 
$sql3->execute();}` 

Le "select id .." ligne génère un message d'erreur SQL mais si je coder en dur comme

(select id from foo2 where code='N') 

alors le programme fonctionne sans erreur. J'ai essayé des caractères d'échappement, en utilisant des doubles guillemets dans les guillemets simples etc. Comment est-ce que je peux mieux contourner ce problème?

Le code pour créer foo était

$sql2 = $pdo->prepare(' 
    CREATE TABLE foo(
     id INT NOT NULL AUTO_INCREMENT, 
     var1 VARCHAR(3) NOT NULL UNIQUE, 
     var2 VARCHAR(32) NOT NULL, 
     var3 INT NOT NULL, 
    PRIMARY KEY (id), 
     FOREIGN KEY (var3) REFERENCES foo2 (id) 
     ON DELETE RESTRICT 
     ON UPDATE RESTRICT) ENGINE=INNODB'); 

Répondre

0

Ce n'est pas la façon d'utiliser les commandes préparées

$pdo->prepare("INSERT INTO foo (var1, var2, var3) 
    VALUES ('{$inputarray[$i][0]}' 
     ,'{$inputarray[$i][1]}' 
     , (select id from foo2 where code='($inputarray[$i][3])') 
        )"); 

Ceci est la concaténation de chaîne ancienne plaine, à toutes fins pratiques vous pourriez aussi utiliser bien mysql_* fonctions ici. La façon correcte d'utiliser PDO est la suivante:

$pdo->prepare("INSERT INTO foo (var1, var2, var3) 
    VALUES (?,?, (select id from foo2 where code=?))"); 

$pdo->bindParam(1, $inputarray[$i][0]) 
$pdo->bindParam(2, $inputarray[$i][1]) 
$pdo->bindParam(3, $inputarray[$i][3]) 

Notez combien votre code est devenu plus lisible? Vous pouvez éviter les appels répétitifs à bindParam en transmettant directement les paramètres à execute.

ps: Pour faire travailler votre code actuel {$inputarray[$i][3]} noter les nouvelles des accolades ajouté

+0

Merci beaucoup pour la réponse @ e4c5 – Mahu11

+0

Heureux d'avoir aidé – e4c5