8791 sujets

Développement web côté serveur, CMS

Bonjour,
j'ai un petit problème avec mysqli ou PDO, je cherche à faire :

//ce code fait ce que je lui demande mais cela m'embête un peu d'utiliser mysql_
$sql = 'INSERT INTO table (champs1,champs2,champs3) VALUES';
foreach($tab as $entite){
     $sql.= '('.$entite['champs1'].','.$entite['champs2'].','.$entite['champs3'].'),';
}
mysql_query(substr($sql, 0, -1)) or die(mysql_error());

Le problème avec mysqli ou PDO vient du fait que j’insère des données sérialisées et qu'il me transforme les accolades par un espace vide puisque mes variables sont dans la partie texte de ma requête.
Pour faire marcher ce code avec mysqli ou PDO je ne vois qu'une seule façon de faire qui est de réaliser une insertion à chaque tour de boucle. Mais il se trouve que je peux avoir 100 milles insertions et question performance je préfère vraiment éviter les 100 milles insertions.
Comment faire ?
Salut !

On est presque dans le même cas.

Mais pour ton cas, vu que tu ne contrôles pas les données à insérées, tu peux traduire directement cette requête.

Ensuite, tu peux donner comme directive, à chaque fois que tu as fait 10000 boucle, tu fait la requête, ce qui donnerait 100 requête pour arriver à 100 000.

Je te conseille fortement de passer par les requêtes préparées (gain de performance plus que notable!)

Si tu as ton code en PDO, ça serait plus facile de t'aiguiller Smiley cligne
Le code en utilisant mysqli donnerait quelque chose comme ça mais serait bien trop lourd pour exécuter un nombre illimité de requêtes:


foreach($tab as $entite){
     $sql = 'INSERT INTO table (champs1,champs2,champs3) VALUES (?,?,?)';
     $stmt = $mysqli->prepare($sql);  
     //Mon problème c'est le bind_param
     $stmt->bind_param('sss', $entite['champs1'], $entite['champs2'], $entite['champs3'] );
     $stmt->execute();
     $stmt->close();
}


Le question que je souléve est selon moi un problème de débutant avec les solutions mysqli et PDO. Je pense qu'une solution simple doit exister mais je ne l'a connais pas.
PS : je n'utilise pas PDO sur cette application car il s'agit d'un module drupal et drupal utilise mysqli.
Modifié par Su4p (15 Nov 2012 - 12:26)
Salut,
Un truc comme ceci (je n'utilise pas mysqli) ?
Une boucle pour créer ta requête et une autre pour la préparer ?

<?php 
$requete = 'INSERT INTO table(
    col1 ,
    col2)
       VALUES ';
// boucle création requête
foreach($tab as $key=>$entite){
    $requete.='(:col1'.$key.', :col2'.$key.'),';
}
$requete= substr($requete,0,-1);
$req = $db->prepare($requete);
// boucle préparation requête
foreach($tab as $key=>$entite){
    $req->bindValue(':col1'.$key.'', $entite['champs1'], PDO: [langue]ARAM_INT);
    $req->bindValue(':col2'.$key.'', $entite['champs2'], PDO: [langue]ARAM_STR);
}
$req->execute();
?>


Je n'ai pas testé, j'ai trouvé ça ici.

tm
Bonsoir,
Su4p a écrit :
Le problème avec mysqli ou PDO vient du fait que j’insère des données sérialisées et qu'il me transforme les accolades par un espace vide puisque mes variables sont dans la partie texte de ma requête.
Je ne comprend pas, tu aurais un exemple ?

Sinon comme dit à Super_baloo8 tu peux faire un select avec insert. Mais contrairement à ce que j’avais dit, il ne faut pas le mettre dans VALUES() car cela sous entend qu'il n'y aura qu'une ligne retourné par select.
INSERT INTO table(col1, col2, col3) SELECT col2, col3, col1 + col5 FROM plop