2013-11-20 3 views
0

Я создаю текстовый файл для хранения моих переменных с одной веб-страницы. Когда пользователь нажимает кнопку добавления (например, корзины покупок), данные вводятся в соответствующий текстовый файл на сервере. Мой код приведен ниже:PHP update text file

$file = "../file/".$profile.".txt"; 
$qty=1; 
$file_handle = fopen($file, "rb"); 

$profileID=mysql_query("SELECT * FROM `profile` WHERE `name`='$profile'",$con); 
$profileID = mysql_fetch_row($profileID); 
$profileID=$profileID[0]; 
$current = file_get_contents($file); 
//$current.=file_put_contents($file, $profile."\n"); 
$result="SELECT p.*, pk.*,p.id as PID FROM `pricing` p 
JOIN (SELECT `distributor`,MAX(`version`) AS ver FROM `pricing` GROUP BY `distributor`) mx ON mx.ver = p.version AND p.distributor = mx.distributor 
JOIN `product_picker` pk ON pk.code = p.code AND pk.profile_name=$profileID AND p.id=$productID"; 
$result=mysql_query($result); 
while($row = mysql_fetch_array($result)) 
{ 
    $pricingID=$row['PID']; 
    $code=$row['code']; 
    $buy=$row['buy']; 
    $markup=$row['custom markup']; 
    $sell=$buy*$markup; 
    $buy="$".number_format((float)$sell,2,'.',''); 
    $stock=explode('.',$row['stock']); 
    $stock=$stock[0]; 
} 
if (file_exists($file)) 
{ 
    $count=count(file($file)); 
    while (!feof($file_handle)) 
    { 
     $line_of_text = fgets($file_handle); 
     $parts = explode('|', $line_of_text); 
     $pid=trim($parts[0]); 
     if($pid==$pricingID) 
     { 
      $qty=$qty+1; 
     } 

    } 
    fclose($file_handle); 
} 

    $current.=$pricingID."|".$code.",".$buy.",".$stock."|".$qty."\n"; 
    file_put_contents($file, $current); 

Согласно кодексу, формат текстового файла будет:

793|EX-24-AFL,$2425.95,0|1 
8078|EX-48-AFL,$3619.35,0|1 
866|EX-PWR-320-AC,$303.24,20|1 
793|EX-24-AFL,$2425.95,0|2 
793|EX-24-AFL,$2425.95,0|3 

Первый столбец представляет собой идентификатор (793,8078,866). Приведенный выше код вставляется каждый раз в текстовый файл. Но мне нужно изменить последнее значение (qty), если первый столбец текстового файла уже существует.

Так выходной текстовый файл должен быть

793|EX-24-AFL,$2425.95,0|3 
8078|EX-48-AFL,$3619.35,0|1 
866|EX-PWR-320-AC,$303.24,20|1 

Любой, пожалуйста, помогите мне?

+0

В чем вопрос? – ficuscr

+0

Я хочу изменить последнюю переменную ($ qty) в каждой строке, если есть pricingID (первая переменная в строке) уже существует. В противном случае вставьте новую строку в текстовый файл – NewPHP

+0

Извините. Не видел. Ну, главное, что выпрыгиваете, вы только открываете файл в [режиме записи] (http://php.net/manual/en/function.fopen.php). Не собираюсь обновлять его таким образом. – ficuscr

ответ

2

Прежде всего, я бы порекомендовал вам не писать собственный плоский файл для корзины покупок, а скорее создать таблицу корзины покупок в вашей базе данных.

Однако, если вы хотите действовать таким образом, то, что вы хотите, может быть выполнено с небольшим изменением существующего кода.

if (file_exists($file)) 
{ 
    $count=count(file($file)); 
    $new_file_contents = ""; //contents to overwrite this file with 

    while (!feof($file_handle)) 
    { 
     $line_of_text = fgets($file_handle); 
     $parts = explode('|', $line_of_text); 
     $pid=trim($parts[0]); 
     if($pid==$pricingID) 
     { 
      $parts[2] = $qty + 1; //store incremented qty in array 
      $line_of_text = implode("|", $parts); //use implode to put array back together 
     } 
     $new_file_contents .= $line_of_text; //store this in new file contents 
    } 
    fclose($file_handle); 
} 

file_put_contents($file, $new_file_contents); 

Однако, я бы, вероятно, подошел к этому с регулярным выражением. Я считаю, что это более простой способ справиться с этим, и не имеет дело с итерацией по каждой строке файла.

if (file_exists($file)) 
{ 
    $file_contents = file_get_contents($file); 

    $pattern = "/(${pid}\|[^\|]*\|)([0-9]+)/"; //establish regex pattern matching lines based on pid 
    preg_match($pattern, $file_contents, $matches); //match the line of this pid 
    $qty = $matches[2] + 1; //get the quantity currently in cart for this product and increment it 
    $replace = '${1}' . $qty; //build our replacement string using a callback and new quantity 
    $file_contents = preg_replace($pattern, $replace, $file_contents); //replace it in the file 
    file_put_contents($file, $file_contents); //overwrite old file with updated quantity 
} 
+0

Спасибо за ответ, позвольте мне попробовать – NewPHP