我可能会以错误的方式看待这个问题,但我有一个表单可以完成它的事情(发送电子邮件等等)但我也会输入一些代码来制作一个简单的flatfile csv日志,其中包含一些用户输入的详细信息。
如果用户意外地输入'himynameis',“bob'这将破坏csv行(因为引号未被封装)或者如果我对数据使用htmlspecialchars()和stripslashes(),我最终得到一个丑陋的数据值'himynameis","bob'
。
我的问题是,如何在不破坏我的csv文件的情况下处理传入的数据以满足'''被放入表单?
这是我创建csv日志文件的代码。
@$name = htmlspecialchars(trim($_POST['name']));
@$emailCheck = htmlspecialchars(trim($_POST['email']));
@$title = htmlspecialchars(trim($_POST['title']));
@$phone = htmlspecialchars(trim($_POST['phone']));
function logFile($logText)
{
$path = 'D:\logs';
$filename = '\Log-' . date('Ym', time()) . '.csv';
$file = $path . $filename;
if(!file_exists($file))
{
$logHeader = array('Date', 'IP_Address', 'Title', 'Name', 'Customer_Email', 'Customer_Phone', 'file');
$fp = fopen($file, 'a');
fputcsv($fp, $line);
}
$fp = fopen($file, 'a');
foreach ($logText as $record) {
fputcsv($fp, $record);
}
}
//Log submission to file
$date = date("Y/m/d H:i:s");
$clientIp = getIpAddress(); //get clients IP address
$nameLog = stripslashes($name);
$titleLog = stripslashes($title);
if($_FILES['uploadedfile']['error'] == 4) $filename = "No file attached."; //check if file uploaded and return
$logText = array(array("$date", "$clientIp", "$titleLog", "$nameLog", "$emailCheck", "$phone", "$filename"));
logFile($logText); //write form details to log
以下是传入数组数据的示例:
Array
(
[0] => Array
(
[0] => 2010/05/17 10:22:27
[1] => xxx.xxx.xxx.xxx
[2] => title
[3] => """"himynameis","bob"
[4] => example@example.com
[5] => 346346
[6] => No file attached.
)
)
TIA
贾里德
答案 0 :(得分:2)
您可以将用户输入中的任何"
更改为""
。这是RFC 4180推荐的,OpenOffice Calc和Excel以及其他程序将正确处理。
您可以使用str_replace。它可能比preg_replace稍快一些:
function csv_quote_escape($input)
{
return str_replace('"', '""', $input);
}