2010-10-26 8 views
0

J'ai un tableau avec plus de 30000 entrées qui doivent aller dans une table MySQL.php + mysql: insérer un tableau php dans mysql

Quelle est la meilleure pratique? D'ici? Supposons que [0], [1] et [2] dans la base de données soient 'title', 'type' et 'client'

Est-ce que cela ajoute des noms de clé correspondant aux noms des colonnes dans la table et appelle som "magic " fonction? Ou construire la requête manuellement ...

Array 
(
    [0] => Array 
     (
      [0] => 2140395946 
      [1] => 1SAP 
      [2] => 0041451463 
     ) 

    [1] => Array 
     (
      [0] => 2140411607 
      [1] => 2SAP 
      [2] => 0041411940 
     ) 

    [2] => Array 
     (
      [0] => 2140706194 
      [1] => 4SAP 
      [2] => 0041411943 
     ) 
etc. etc. 

MISE À JOUR - en fonction des réponses

Merci pour les réponses.

La solution serait normalement de créer manuellement la chaîne SQL et toutes les lignes peuvent être insérés comme un:

INSERT INTO `tx_opengate_table` (`machine` ,`customer` ,`type`) 
VALUES 
    ('m123', 'dfkj45', 'A'), 
    ('m137', 'kfkj49', 'A'), "repeat this line for each entry in the array" 
    ... ... ... 
    ('m654321', '34dgf456', 'C4') "end with out comma, or remove last comma" 
; 

spécial pour TYPO3

J'arrive de le faire dans le CMS TYPO3 et juste venu à travers une nouvelle fonction ajoutée il n'y a pas si longtemps:

//Insert new rows 
$table = 'tx_opengate_stuff'; 
$fields = array('machine','type','customer'); 
$lines = "array as given above" 
$GLOBALS['TYPO3_DB']->exec_INSERTmultipleRows($table,$fields,$lines); 

Répondre

3

Je dirais juste de le construire vous-même. Vous pouvez le configurer comme ceci:

$query = "INSERT INTO x (a,b,c) VALUES "; 
foreach ($arr as $item) { 
    $query .= "('".$item[0]."','".$item[1]."','".$item[2]."'),"; 
} 
$query = rtrim($query,",");//remove the extra comma 
//execute query 

N'oubliez pas d'échapper les guillemets si nécessaire.

De même, veillez à ce qu'il n'y ait pas trop de données envoyées en même temps. Vous devrez peut-être l'exécuter en morceaux au lieu de tous en même temps.

+0

Super. C'est ça.Je suppose que cela devrait juste être $ item [0], $ item [1] et $ item [2] et pas le tableau $ arr qui devrait aller dans la chaîne de requête $. – Tillebeck

+0

Oui, désolé. Je l'ai corrigé. –

+0

Il est toujours nécessaire, comme vous l'avez déclaré dans le commentaire récent :) –

2

Fonction magique? Je suppose que vous voulez dire une sorte de couche d'abstraction DB? À mon humble avis, cela ne ferait que doubler votre travail. Construisez simplement la requête en bouclant manuellement les valeurs du tableau [] INSERT'ing au fur et à mesure.

1

Vous devrez générer la requête manuellement si vous voulez obtenir les meilleures performances pendant cette opération. Si vous souhaitez ajouter de manière itérative tout en utilisant PDO ou une couche d'abstarction, vous aurez 30000+ requêtes d'insertion.

Utilisez foreach pour effectuer une itération sur l'analyse, créer une requête INSERT imbriquée qui effectue tout le travail en une seule fois et l'envoyer au serveur.

+0

Faire des insertions étendues ici est une mauvaise idée. Vous avez déjà vu ce qui se passe quand vous remplissez le tampon MySQL? Peut-être faire des insertions étendues pour 10 à la fois n'est pas une mauvaise idée, mais cela dépend de la longueur des données. – Brad

+0

Vous devez toujours être conscient de la taille de la mémoire tampon lors d'une insertion en masse dans MySQL. Cela ne fait pas une mauvaise idée. Je n'ai jamais eu ce problème avec 100 - 1000 enregistrements à la fois sans le paramétrer. Vous pouvez configurer la longueur du tampon en définissant la valeur bulk_insert_buffer_size. Il est par défaut 8388608, donc si vous allez avoir un problème dépend vraiment de la taille des valeurs du champ. Clairement, quand j'ai essayé d'insérer 1000 lignes à la fois, ma longueur moyenne des valeurs pour une rangée était inférieure à 830 caractères. En regardant la question, je ne m'attends pas à ce qu'une ligne soit plus longue que 40 caractères. –

2
$statement = "INSERT INTO table (title, type, customer) VALUES "; 
foreach($data as $row) { 
    $statement .= ' ("' . implode($row, '","') . '")'; 
} 

MISE À JOUR: Changé exploser à imploser (je reçois toujours ces confus).

+0

Génial. Quelque chose comme ça. Je suppose que vous utiliseriez "implode" pour concatuer le tableau $ row à une chaîne, non? Sinon je me méprend ;-) – Tillebeck

+0

Je trouve celle-ci la meilleure réponse SI vous changez d'exploser pour imploser ... –