2017-09-01 97 views
0

我有一个.text文件中至极我店像这样的数据:PHP:如何检查表单数据是否与文本文件中的相同?

<tr><td>Val 1</td><td>Val 2</td><td>Val 3</td></tr> 
<tr><td>Val 1</td><td>Val 2</td><td>Val 3</td></tr> 
<tr><td>Val 1</td><td>Val 2</td><td>Val 3</td></tr> 

每分钟左右加入一个新的字符串。

我有一个三个输入的表格,val1,val2val3。当表单提交它保存的值,以这样的文本文件:

[HTML element] Val 1 [2 HTML elements] val2 [2 HTML elements] val3 [2 HTML elements] 

我的问题是:如何在文件中搜索字符串是否存在,如果是的话,执行的代码块,如果没有,请继续并将数据保存到文件中?

我知道我可以使用一个数据库,但我有一个.text文件来做到这一点。

+0

为什么要存储_data_与HTML代码混合...? – CBroe

回答

1

我认为现有的回答满足的问题,而只是对 问题本身发表评论:

一些可以简化操作使用不同的格式,为您 文本文件。我假定你正在使用的文件里标记,这样你 可以轻松将其显示为HTML,但你不应该让你的数据显示 的方式决定你的数据存储方式。如果您存储在一个CSV 您的数据,然后你能够很容易地代表你的数据表作为一个数组,这使得 访问要容易得多值,你在内存中,而不是单一的长字符串有结构化和层次化 表示。

这不仅可以简化数据处理,还可以让您轻松更改数据的显示方式,而无需更改数据的结构 。目前,如果你想使用 div的,而不是表中显示您的数据,那么你就必须改变的不仅仅是所有文本文件本身的数据 也全部在你的代码的地方,在那里你 期望能够解析它。通过分离存储表示和视觉 表示你能够做出一个位置这些变化。使用CSV还可以使您的数据在其他系统中更好地互操作。

你可以存储你的数据像这样:

Val 1a, Val 2a, Val 3a 
Val 1b, Val 2b, Val 3b 
Val 1c, Val 2c, Val 3c 

然后访问现有的数据并保存新的数据可能是:

<?php 

define("DATA_FILE", "data.csv"); 

/** 
* Retrieves the data from the csv file and returns it in the format: 
* [ 
* [ 
*  Val1 => ..., 
*  Val2 => ..., 
*  Val2 => ..., 
* ], 
* [ 
*  Val1 => ..., 
*  Val2 => ..., 
*  Val2 => ..., 
* ] 
* ], 
*/ 
function getData() { 
    // these will be the key names for the fields in the array 
    $fieldNames = ["Val1", "Val2", "Val3"]; 
    $data = []; 
    foreach (file(DATA_FILE) as $row) { 
    $csvRow = str_getcsv($row); 
    $data[] = array_combine($fieldNames, $csvRow); 
    } 
    return $data; 
} 

/** 
* Saves new data to the file. Takes data in the form: 
* [ 
* Val1 => ..., 
* Val2 => ..., 
* Val2 => ..., 
* ], 
*/ 
function saveNewData($values) { 
    $fp = fopen(DATA_FILE, "a"); 
    fputcsv($fp, [$values["Val1"], $values["Val2"], $values["Val3"]]); 
    fclose($fp); 
} 

然后将数据阵列打印成表:

<?php 
/** 
* Returns HTML markup for displaying the data in a table. Returns something 
* like: 
* 
* <tr><td>Val1</td><td>Val2</td><td>Val3</td></tr> 
* <tr><td>Val1</td><td>Val2</td><td>Val3</td></tr> 
*/ 
function getTableMarkup($data) { 
    $markup = ""; 
    foreach ($data as $item) { 
    $markup .= "<tr>"; 
    foreach ($item as $field) { 
     $markup .= "<td>{$field}</td>"; 
    } 
    $markup .= "</tr>"; 
    } 

    return $markup; 
} 

然后,当你把它捆在一起为你的用例,你会有东西l迈克:

<?php 

// get the submitted form values 
$newValues = [ 
    "Val1" => $_REQUEST["Val1"], 
    "Val2" => $_REQUEST["Val2"], 
    "Val3" => $_REQUEST["Val3"], 
]; 

// fetch the existing data from the file in a structured array 
$data = getData(); 

// check if the newly submitted values already exist in the data 
if (in_array($newValues, $data)) { 
    echo "Data already exists..."; 
} else { 
    echo "Data doesn't exist, saving it..."; 
    saveNewData($newValues); 
    $data = getData(); 
} 

// display the table of data 
echo "<table>" . getTableMarkup($data) . "</table>"; 

我知道这可能不是你能够使在这一点上的变化,但我 认为它还是值得一提。还要注意,在这里我假设你 正在检查一行数据是否已经存在,其中三个新值是 与该行中的三个现有值相同。如果您想检查提交的Val1是否与以前提交的Val2相同,那么您将 需要将in_array呼叫更改为执行适当的 检查的功能。但是,由于数据格式化为数组,因此检查将包括 ,只需对现有数据进行迭代,然后将您想要的任何字段与新字段进行比较。

0

首先,你必须通过阅读和字符串搜索,如果没有找到该字符串,然后执行操作来检查文件。请参考下面的例子。

<?php 

$productFile = file_get_contents('products.txt'); 
$products = str_word_count($productFile, 1); 

$status = 'i love watching tv on my brand new apple mac'; 

$found = false; 
foreach ($products as $product) 
{ 
    if (strpos($status,$product) !== false) { 
     $found = true; 
     break; 
    } 
} 

if ($found) { 
    echo 'the status contains a product'; 
} 
else { 
    echo 'The status doesnt contain a product'; 
} 

?> 
+0

这是完美的我的需要:)谢谢 – KrisGeor

+0

@KrisGeor:很高兴知道它解决了我们的问题。接受答案和upvote当你会在门户网站找到有用的答案.. – Sucharitha

相关问题