而在里面,而只运行一次


while inside while runs just once

我对这段代码有问题,问题是内部while只运行一次,而外部while做对了。可能是什么问题?

注意:$producto_id是一个带有 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);                
}
我相信

你有一个csv,里面有ID和优惠券。您似乎正在尝试浏览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
        }
    }
}

这完全取决于您的意思:

($data = fgetcsv($handle, 0, "$delimiter")

如果您的意思是:($data == fgetcsv($handle, 0, "$delimiter"))也就是说,数据的价值等于 FGETCSV 的结果 那么你的代码是错误的。并切换到"=="

如果您的意思是:($data = fgetcsv($handle, 0, "$delimiter"))fgetcsv 可以返回"0",这就是原因。

在 if 语句中间使用"赋值"始终是一种不好的做法。

如果在 if 语句中间执行赋值,则赋值的值将传递给布尔表达式。 除 0 以外的任何值都被视为 true。 否则,0 被视为假。