PHP et MS SQL 2012 : envoyer beaucoup de données possible ?

Fermé
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 - 3 févr. 2014 à 14:49
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 - 10 févr. 2014 à 11:38
Bonjour aux mordus de PHP,

Allez, petit défit de début de semaine. Avant toute chose, mise en situation très rapide :

Base de données A : Informix, très vielle, pas d'index définit sur les tables, non modifiable.
Base de données B : MS SQL 2012

Utilisation d'un driver ODBC pour communiquer avec la base Informix (test de connexion OK)

Le but est d'importer des données de la base A à la base B. Problème, avec l'assistant de MS SQL 2012, ça ne fonctionne pas, problème entre autre d'accès aux données car erreurs dans la structure. Bref, ce serait trop long de vous expliquer pourquoi ça ne fonctionne pas, mais sachez que je pense avoir tout essayer, sans résultat.

Solution alternative, utiliser une page PHP pour faire l'intermédiaire. Et là je sais que ça peut fonctionner.

Ma question : est ce qu'il est possible d'envoyer beaucoup de données rapidement de ma base A vers ma base B en passant par PHP ?

Là où j'en suis : création d'un fichier CSV en PHP qui contient toutes les données de la base A ; ce fichier peut être importé dans la base B, ça fonctionne très bien. Le problème, c'est que dans la base A j'ai un peu plus de 45.000 lignes à récupérer toutes les demi-heures, et je dépasse à chaque fois le temps d'exécution max par défaut, à savoir 300 sec. Je n'ai pas spécialement envie de changer cette valeur pour l'augmenter parce que j'ai d'autres scripts qui tournent.

Voici la première solution à laquelle j'ai pensé, mais niveau temps d'exécution, on repassera :


$result2 = odbc_exec($cnx, "SELECT * FROM hvdn");
while (odbc_fetch_row($result2)) {
INSERT INTO BDD"B" Values ......
}

Enfin, exécuter 45.000 requêtes d'INSERT, j'ai même pas essayé.

Est ce qu'il existe un moyen en PHP de pouvoir stocker rapidement tous les résultats d'un SELECT puis de les envoyer automatiquement dans un MS SQL ?


A voir également:

1 réponse

sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
10 févr. 2014 à 11:38
Re coucou !

Bon, en l'absence de réponse, j'ai dû improviser et faire avec ce que je pouvais trouver sur Internet. Je suis donc passé par un intermédiaire, le fichiers CSV ; une première étape créé le fichier CSV en récupérant les données avec l'ODBC, la seconde étape consiste à faire un INSERT pour chaque ligne de ce fichier CSV (l'intermédiaire CSV, bien qu'inutile et contraignant, me permet de faire une vérification des données importées car les scripts sont exécutés 1 fois par demi heure, 1 fois par jour et 1 fois par mois).

En gros :

Création du CSV, avec :

$handle = fopen(moncsv.csv, 'w+');

fputcsv($handle, array(titre_champ1, titre_champ2, titre_champ3, ...))

$result = odbc_exec($cnxIFX, "SELECT * FROM table WHERE ...");

while (odbc_fetch_row($result)) {
fputcsv($handle, array(
odbc_result($result, 'champ1'), odbc_result($result, 'champ2'), odbc_result($result, 'champ3'), ....
)
}

Puis import dans la base MSSQL 2012 :


$query = "INSERT table values (?,?,?...)

$param01 = null;
$param02 = null;
$param03 = null;
...

$params = array(
&$param01, &$param02, &$param03, ...)

$prep = prepare($cnxMSSQL, $query, $params);

$file = "moncsv.csv";

$csv_array = file($file);

foreach ($csv_array as $row_num => $row) {
$row = trim ($row);
$column = explode ( ',' , $row );
$param01 = $column[0];
$param02 = $column[1];
$param03 = $column[2];
...
$result = execute ( $prep );

Avec
prepare()
et
execute()
qui sont des fonctions définies sur une autre page (trouvées sur le net ;-))

Voilà en gros comment ça marche.

Je laisse ce sujet en non résolu car si quelqu'un passe par ici et à une solution moins ressourcesovore à me proposer, je suis preneur ;-)
0