2009-12-01 4 views
0

Je suis en train d'écrire un script php qui prend un fichier texte briser son contenu et et l'insérer dans une base de données MySql, le code est le suivant:Php multi-dimensionnelle Array/problème MySql

$file = "my_file.txt"; 

$db = "db_name"; 

$link = mysql_connect("localhost","root"); 

if(!$link) die("Connection Failed");  

mysql_select_db($db) or die("Could not open $db: ".mysql_error()."<br />"); 

$fp = fopen($file, 'r') or die("Could not open file"); 
$my_filesize = filesize($file); 

while(!feof($fp)) { 
    $prod_doc.=fread($fp, $my_filesize); // store the file in a variable 
} 

$prod_array = explode("~",$prod_doc); // create a array with the explode function 

for($i=0; $i<count($prod_array); $i++){ 
    $prod_items[$i] = explode(',', $prod_array[$i]); // create a malti-dimensional array 
} 

$query = "INSERT INTO my_table(feild1, feild two, feild three) 
      VALUES ('$prod_items[$i][0]','$prod_items[$i][1]','$prod_items[$i][2]') 
     "; 

$result = mysql_query($query); 

if(!$result) die(mysql_error());    

$result = mysql_affected_rows($result); 

echo $result; 

mysql_close($link); ` 

Mon problème est le suivant: Array [0], Array [1], Array [3] est ce qui est entré dans la base de données au lieu de mes données. Merci d'avance, applaudissements.

+1

juste un petit indice, peut-être cela aide: le $ i sur votre requête est déjà ambigu car votre requête n'est pas dans la boucle. – junmats

Répondre

1

Vous avez itérer sur votre tableau de prod_items $ ainsi, concate alors les valeurs

$insert = array(); 
for($i=0; $i<count($prod_array); $i++){ 
    $prod_items[$i] = explode(',', $prod_array[$i]); // create a malti-dimensional array 
    $insert[] = '(' .$prod_items[$i][0]. ', '.$prod_items[$i][1]. ', '. $prod_items[$i][3] .')'; 
} 

$insert_string = implode(', ', $insert); 

$query = "INSERT INTO my_table(feild1, feild two, feild three) 
      VALUES" . $insert_string; 

Et vous devez utiliser foreach insted de pour.

0

On dirait que vous avez ignoré du code. Après l'explosion, vous aurez un tableau de chaînes, pas un tableau 2d. Il est également préférable de mettre à jour un peu le code.

$query = "INSERT INTO my_table(feild1, feild_two, feild_three) VALUES ('".$prod_items[$i][0]."','".$prod_items[$i][1]."','".$prod_items[$i][2]."') "; 
0

Vous devez utiliser la technique de concaténation standard (.) Pour cela. PHP ne peut évaluer les variables simples dans une chaîne:

"$ var" -> var est évalué "var- $> var" -> est pas évalué "$ var [0]" -> est pas évalué

$query = "INSERT INTO my_table(feild1, feild two, feild three) 
      VALUES ('".$prod_items[$i][0]."','".$prod_items[$i][1]."','".$prod_items[$i][2]".') 
     "; 
+0

PHP peut interpoler chaque type de variable à l'intérieur d'une chaîne, il suffit de les entourer de '{...}'. C'est une question de goût, mais je préfère cela à une séquence interminable de citations, de guillemets et de points. –

2

pour accéder aux valeurs des éléments variables de tableau utilisé dans un besoin de chaîne guillemet accolades délimiteurs:

"'{$prod_items[$i][0]}','{$prod_items[$i][1]}','{$prod_items[$i][2]}') "; 

une autre façon de coder ceci est en concaténation (dans ce cas, vous ne besoin des délimiteurs supplémentaires):N'oubliez pas, si les données d'entrée sont imprévisibles, vous devez filtrer les caractères qui peuvent casser votre suite ou compromettre les principes de sécurité. VOIR How can I prevent SQL injection in PHP?

De plus, le commentaire de junmats est correct, vous exécutez seulement la requête en dehors de la boucle for qui n'a pas de sens.

Questions connexes