我已经构建了这个脚本,它应该只保存唯一的行,在这种情况下是url的。每行一个url到.txt文件中。
在我的表单上,我只有一个值来自输入名称=“url”的“url”。
脚本工作,得到值,检查是否唯一,写入常量文件,然后我应用从A到Z的排序,并将排序的输出写入新的临时文件。以下是我想要提出的3件事,感谢任何帮助:
我不确定这是否是将排序写入新文件的正确方法,还是可以重写原始文件
临时文件在带有值的行之间用空行写入。无法从空行的来源中找出来。
最后一位是临时文件总是比常量文件少一行。
<?php
// config
$url = $_GET['url'];
$n = "\n";
$data = $url . $n;
$file = "datatest.txt"; // constant file
$file2 = "datatest2.txt"; // temp file
// check for duplicates & add new value if unique
$unique_data = file_get_contents($file);
if(strpos($unique_data, $data) === false){
$fh = fopen($file, 'a') or die("Can't open the file");
// chmod (optional)
chmod($file,0666);
chmod($file2,0666);
// sort
$lines = file($file);
sort($lines);
// write to original
$record = file_put_contents($file, $data, FILE_APPEND | LOCK_EX);
// write to temp
$record2 = file_put_contents("$file2", implode("\n", $lines));
}
// testing echo the results
if (empty($record)){
echo "data already exists </br></br>";
}else{
echo $record . " bytes written to file </br></br>";
echo $record2 . " bytes written to file2 </br></br>";
}
// display all (change file if needed)
$fh = fopen($file, 'r');
$pageText = fread($fh, 25000);
echo nl2br($pageText);
?>
任何意见都表示赞赏。
编辑:
借助@Barmar的帮助,我成功地消除了积分2&amp; 3。
<?php
// config
$url = $_GET['url'];
$n = "\n";
$data = $url . $n;
$file = "temp.txt"; // temp file in local folder
$file2 = "constant.txt"; // constant counterpart file
// check for duplicates & add new value if unique
$unique_data = file_get_contents($file);
if(strpos($unique_data, $data) === false){
$fh = fopen($file, 'a') or die("Can't open the file");
// chmod (optional)
chmod($file,0666);
chmod($file2,0666);
// write to original
$record = file_put_contents($file, $data, FILE_APPEND | LOCK_EX);
// sort
$lines = file($file, FILE_IGNORE_NEW_LINES);
sort($lines);
// write to temp
$record2 = file_put_contents($file2, implode("\n", $lines), LOCK_EX);
}
// testing echo the results
if (empty($record)){
echo "data already exists </br></br>";
}else{
echo $record . " bytes written to file </br></br>";
echo $record2 . " bytes written to file2 </br></br>";
}
// display all (change file if needed)
$fh = fopen($file2, 'r');
$pageText = fread($fh, 25000);
echo nl2br($pageText);
?>
仍然无法弄清楚如何只使用一个文件。 @Barmar,我试图使用你的“in_array”,但它给了我一个错误。
答案 0 :(得分:1)
是的,可以重写原始文件。只需使用一个始终排序的文件:
$lines = file($file, FILE_IGNORE_NEW_LINES);
if (in_array($url, $lines)) {
$lines[] = $url;
sort($lines);
file_put_contents($file, implode("\n", $lines) . "\n");
}
空行来自implode("\n", $lines)
,因为$lines
中的字符串已经以换行符结尾。所以你要在它们之间添加第二个换行符。在上面的代码中,我使用FILE_IGNORE_NEW_LINES
来阻止它将它们包含在字符串中。
我怀疑这与换行有关,但我不太确定。