由于计数器PHP,结果显示了两次

时间:2019-01-31 04:42:59

标签: php

我有2个文件,buyerInterest.phpcarDetails.php。当某人说出对汽车的兴趣时,他们将必须输入车牌号。然后,我将车牌号写入txt文件。然后,通过计算插入特定车牌的次数,我将能够显示buyerInterest.php对汽车感兴趣的总人数。但是,同一辆车被显示了两次,计数增加了。

buyerInterest.php

<?php
if(isset($_POST['submit']))
{

    $fname =$_POST['fname'];
    $lname=$_POST['lname'];
    $phone=$_POST['phone'];
    $platenum=$_POST['platenum'];
    $price=$_POST['price'];

    $file = fopen("BuyerInterest.txt","a+");
    $countfile = fopen("counter.txt","a+");

    fwrite($file,$fname . ',');
    fwrite($file,$lname . ',');
    fwrite($file,$phone . ',');
    fwrite($file,$platenum . ',');
    fwrite($file,$price . PHP_EOL);

    fwrite($countfile,$platenum . PHP_EOL);

    print_r(error_get_last());
    fclose($file);
    fclose($countfile);
}
?>

carDetails.php

<table border="2">

<th>First Name</th>
<th>Last Name</th>
<th>Phone</th>
<th>Email</th>
<th>Plate Number</th>
<th>Model</th>
<th>Year of Manufacture</th>
<th>Description</th>
<th>No. of Kilometers Travelled</th>
<th>No. of Previous Owners</th>
<th>Characteristics of Recent Repairs</th>
<th>Number of people interested</th>

<?php
if(isset($_POST['submit']))
{

    $search = $_POST['search'];
    $lines = file('CarDirectory.txt');
    $interest = file('counter.txt');

    // Store true when the text is found

    $found = false;
    $counted = array_count_values(file('counter.txt'));
    foreach($counted as $platenum => $count)
        //echo "{$platenum} : {$count}";

    foreach($lines as $line)
    {
        if(strpos($line, $search) !== false)
        {
            $found = true;
            list($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k) = explode(',', $line);

            print "<tr>
                        <td width=40>$a</td>
                        <td width=40>$b</td>
                        <td width=40>$c</td>
                        <td width=40>$d</td>
                        <td width=40>$e</td>
                        <td width=40>$f</td>
                        <td width=40>$g</td>
                        <td width=40>$h</td>
                        <td width=40>$i</td>
                        <td width=40>$j</td>
                        <td width=40>$k</td>
                        <td width=40>$count</td>

                    </tr>";
        }
    } 
    // If the text was not found, show a message
    if(!$found)
    {
        echo 'No match found';
    }
}
?>

counter.txt

 SFR6543G
 SFR1234H
 SFR1234H

table

2 个答案:

答案 0 :(得分:0)

无需将foreach ($lines as $line)放在foreach ($counted as $platenum => $count)内。因为嵌套的循环,你打印每个匹配的车线在$counted,并使用计数无关的那些汽车每块板。您根本不需要外部循环。

由于$counted是一个关联数组,因此您只需查找$counted[$e]

创建$counted时,还需要删除换行符。

$found = false;
$counted = array_count_values(file('counter.txt', FILE_IGNORE_NEW_LINES));

foreach($lines as $line)
{
    if(strpos($line, $search) !== false)
    {
        $found = true;
        list($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k) = explode(',', $line);
        $count = $counted[$e]
        print "<tr>
                    <td width=40>$a</td>
                    <td width=40>$b</td>
                    <td width=40>$c</td>
                    <td width=40>$d</td>
                    <td width=40>$e</td>
                    <td width=40>$f</td>
                    <td width=40>$g</td>
                    <td width=40>$h</td>
                    <td width=40>$i</td>
                    <td width=40>$j</td>
                    <td width=40>$k</td>
                    <td width=40>$count</td>

                </tr>";
    }
}

顺便说一句,我建议您使用比$a$b等更好的变量。您也可以使用fputcsv()fgetcsv()来读写CSV文件,而不是手工写逗号。

答案 1 :(得分:0)

程序中的错误是您在读取数据时显示数据。因此,很难验证您是否已经显示了车牌号信息。

我将首先读取表中的所有数据(在内存中),确保行是唯一的(同一盘号不会出现两次),根据从文件中读取的信息维护表中的任何计数器。最后,一切正常后,只需打印表格即可。

现在,如果您有一个非常大的文件,则不妨使用数据库-即使是SQLite也比文本文件更好。 -正如@Barmar已经建议的那样。