2016-01-29 3 views
0

У меня проблема с этим кодом, дело в том, что внутренний while просто запускается один раз, а внешний while делает все правильно. В чем может быть проблема?пока внутри работает только один раз

Примечание: $producto_id - массив с идентификаторами.

$st_column = 0; 
$nd_column = 1; 
$posicionArray = 0; 

if (($handle = fopen($ruta, "r")) != FALSE) { 
    fgetcsv($handle); 
    mysqli_query($link, "BEGIN"); 
    while($producto_id[$posicionArray]){       
     $ins_producto = mysqli_query ($link, "INSERT INTO productos (encuesta_id, producto_id, nom_producto) VALUES ('".$encuesta_id."', '".$producto_id[$posicionArray]."', '".$nombre_producto[$posicionArray]."')"); 

     while (($data = fgetcsv($handle, 0, "$delimiter")) != FALSE) {      
      if($producto_id[$posicionArray] == $data[$st_column]){        
       $ins_cupon = mysqli_query ($link, "INSERT INTO cupones (encuesta_id, producto_id, cupon, estado) VALUES ('".$encuesta_id."', '".$producto_id[$posicionArray]."', '".$data[$nd_column]."', 0)");     
      }             
     } 
     $posicionArray ++; 
    } 

    fclose($handle);     
} 
+0

Wheres '$ delimeter' набор? – CodeGodie

+0

В HTML-форме, Только ";" или "," разрешено – Polo

+0

вы можете показать, что такое '$ producto_id'? вы говорите, что это массив идентификаторов, но если массив подобен этому [[0,1,2] ', то ваше начальное условие завершится неудачно, потому что оно будет равным нулю, что приведет к поломке цикла while. – CodeGodie

ответ

0

Все зависит от того, что вы имели в виду:

($ данных = fgetcsv ($ ручкой, 0, "$ разделителем")

, если вы имели в виду: ($ данных == fgetcsv ($ ручки, 0, «$ разделитель»)) , что это значение данных равно результат fgetcsv , то ваш код неправильно и переключиться на «==»

, если вы имеете в виду:. ($ data = fgetcsv ($ handle, 0, "$ delimite r ")) и fgetcsv могут возвращать« 0 », поэтому именно поэтому.

использование «заданий» в середине, если утверждения всегда плохие.

Если вы выполняете задание в середине вашего оператора if, значение присваивания передается в булево выражение. Любое значение, отличное от 0, считается истинным. в противном случае 0 считается ложным.

+0

Хорошо, я пробовал с «==» и не запускался вообще. Так как я могу это исправить? Есть идеи? – Polo

+0

попробуйте выполнить fgetcsv ($ handle, 0, "$ delimiter") перед оператором if. назначьте его переменной и либо отлаживайте, либо какую-то распечатку, чтобы увидеть ее значение. и значение $ data – Mike

0

Я считаю, что у вас есть csv, который содержит идентификаторы и купоны. Кажется, вы пытаетесь пройти через массив producto_id и проверить, существует ли это в вашем CSV. Это то, что я хотел бы сделать:

CSV:

id,cupon 
1,15165165 
1,16516151 
2,16841684 

PHP:

function turn_csv_to_array($csv) { 
    $result = array(); 
    if (($h = fopen($csv, "r")) != FALSE) { 
     $header = fgetcsv($h); 
     while ($row = fgetcsv($h)) { 
      $result[] = array_combine($header, $row); 
     } 
     fclose($h); 
    } 
    return $result; 
} 

$coupons = turn_csv_to_array("test.csv"); 
$product_ids = [1, 2, 3, 4]; 


foreach ($product_ids as $pid) { 
    // INSERT PRODUCT TO PRODUCT_DB 
    foreach ($coupons as $c) { 
     if ($pid == $c['id']) { 
      // INSERT PRODUCT TO COUPONS_DB 
     } 
    } 
} 
+0

Это лучший способ, но все та же проблема. Внутренний foreach только запускается один раз – Polo

+0

Я удалил 'break', что все еще происходит? – CodeGodie

+0

Да, это все равно произойдет – Polo

Смежные вопросы