8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai adopter PDO depuis peu pour gérer mes requêtes SQL (sur une base MySQL).

Pratiques dans bien des cas, je me pose pourtant certaines questions.

Par exemple, j'ai environ 200 enregistrements à faire dans une table, et j'aimerais bien garder la vérification faite par "bindValue()" pour le contenu.

Actuellement j'ai ceci :


$query = '/* Insert Incident */
INSERT INTO `incidents`
(`logon`, `summary`, `description`, `solution`, `state`, `status`, `number`, `save_date`) 

VALUES
(:logon, :summary, :description, :solution, :state, :status, :number, :save_date);';
$n_prep = $pdo->prepare($query);

while($datas = $prep->fetch(PDO::FETCH_OBJ))
	{
	$n_prep->bindValue(':logon', $datas->logon, PDO: [langue]ARAM_INT);
	$n_prep->bindValue(':summary', $datas->summary, PDO: [langue]ARAM_STR);
	$n_prep->bindValue(':description', $datas->description, PDO: [langue]ARAM_STR);
	$n_prep->bindValue(':solution', $datas->solution, PDO: [langue]ARAM_STR);
	$n_prep->bindValue(':state', $datas->state, PDO: [langue]ARAM_STR);
	$n_prep->bindValue(':status', $datas->status, PDO: [langue]ARAM_INT);
	$n_prep->bindValue(':number', $datas->number, PDO: [langue]ARAM_STR);
	$n_prep->bindValue(':save_date', $datas->save_date, PDO: [langue]ARAM_STR);
	$n_prep->execute();
	}


Ce qui donne 200 requête SQL.

Je vois très bien comment faire pour générer une seule requête pour l'ensemble (en passant par la mise en place d'un array pour chaque ligne à insérer), mais uniquement sans le "bindValue()".

Si vous avez une/des idée/s je suis preneur !
En ajoutant un nombre à l'identifiant de colonne.
... VALUES (:logon1, …), (:logon2, …);';

Et adapter la boucle en fonction. Mais c'est moche '^^.

Il y a aussi un second paramètre dans PDO::quote: $parameter_type. Je ne sais pas s'il se comporte comme celui bindvalue(), à tester.

Sinon, je ne sais pas si c'est pour l'exemple, mais tu copies des donnée d'une table vers une autre ? Dans mes souvenirs tu peux mettre un SELECT à la place de valeurs, ça fera une copie.
Merci pour ce retour.

Mais, finalement PDO::quote protège une chaîne, de manière particulière, mais ne fait pas d'insertion directe dans la requête préparer.

Pour la première méthode, ... je l'avais déjà vu, et je suis d'accord avec toi, c'est pas génial.

Je pense que je vais rester avec la méthode actuelle qui est quand même bien performante.

En fait c'est pour un script de migration de base de donnée, entre 2 versions d'un script, donc je prends d'une ancienne base, transforme les champs que j'ai besoin, et réinsère le tout dans une nouvelle base.
Modérateur
Salut Super_baloo8,

J'ai lu attentivement ton post ces jours ci. A première vue je ne voyais pas de solution. Là je viens de voir que tu as développé ton besoin. Si tu fais ceci (petite piste) ça ne fonctionne pas (dans la console par exemple) ?


CREATE TABLE 
	uneNouvelleBase.uneNouvelleTable 
AS SELECT 
	uneAncienneBase.unChamp, uneAncienneBase.unAutreChamp 
FROM 
	uneAncienneBase.uneAncienneTable 
WHERE 
	uneAncienneBase.unChamp = 'une condition'

code fait de tête, je peux m'être trompé

Après, tu fais un ALTER sur ta table si besoin.
Modifié par niuxe (17 Nov 2012 - 22:11)
Salut Niuxe,

C'est tout à fait ce genre de chose qu'il me fallait en fait, car je ne fait que trier le contenu de l'ancienne table pour qu'elle soit conforme à la nouvelle.

Donc ca répond parfaitement à mon besoin actuelle pour ce script !

Merci beaucoup !