我正在尝试编写日志记录功能,到目前为止它的工作原理。我现在面临的唯一问题是我只能成功执行一次该功能。当我再次称它为PHP PHP Fatal error: Cannot redeclare function
时。
现在我想问:
为什么PHP会抱怨我的工作流程?据我所知,我编写了函数占位符3,我可以使用不同的参数一次又一次地使用这个函数。 E. g。第一:
$addNewCar->log(array('makeModelDescription','firstRegistration','mileage','logMessage', 'createTime'),
array($carDetails[0]['FK_makeModelDescription'],
$carDetails[0]['FK_firstRegistration'],
$carDetails[0]['FK_mileage'],
'deleteCarbyID: ' . $addNewCar->affected_rows,
time()
)
); 然后e。 G。
$addNewCar->log(array('makeModelDescription','firstRegistration','mileage','logMessage', 'createTime'),
array($carDetails[0]['FK_makeModelDescription'],
$carDetails[0]['FK_firstRegistration'],
$carDetails[0]['FK_mileage'],
'insertCarById: ' . $addNewCar->affected_rows,
time()
));
功能记录:
public function log($key, $values) {
try {
/** @var $tableColumns Column names in MySQL table */
$tableColumns = $key;
/** @var $tableRows Use 2-dimensional numeric or associative arrays
* for multiple records. Single records can be added with a
* vector */
$tableRows[] = $values;
$DBH = $this->DBH;
/**
* @param $text Unnamed placeholder
* @param int $count Number of unnamed placeholders (size of one array)
* @param string $separator Separator
*
* @return string Concatenated unnamed placeholders, e. g. ?, ?, ?
*/
function placeholders3($text, $count=0, $separator=","){
$result = array();
if($count > 0){
for($x=0; $x<$count; $x++){
$result[] = $text;
}
}
return implode($separator, $result);
}
/**
* Generate unnamed placeholders for SQL statement,
* e. g. (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?).
*
* Pitfalls:
*
* - Nested array: Take care that you iterate over the items
* of the nested array. E. g. $tableRows[0]
* instead of $tableRows;
*
* - sizeof($d): Number of elements per single array
* (for a single db insert).
*/
$insert_values = array();
foreach($tableRows as $d){
$question_marks[] = '(' . placeholders3('?', sizeof($d)) . ')';
$insert_values = array_merge($insert_values, array_values($d));
}
$sql = "INSERT INTO logging (" . implode(",", $tableColumns ) . ") VALUES " . implode(',', $question_marks);
$STH = $DBH->prepare($sql);
$STH->execute($insert_values);
$this->affected_rows = $STH->rowCount();
}
catch(PDOException $e) {
error_log("PDO error: " . $e->getMessage());
}
}
非常感谢提前!
答案 0 :(得分:3)
在全局范围内声明函数。每次调用log()方法时,都会在全局范围内重新声明该函数。有一个简单的解决方案:
if (!function_exists('placeholders3')) {
function placeholders3($text, $count=0, $separator=","){
// ...
}
}
但是你仍然在宣布一个全局功能,你可能不想做。由于您无论如何都在使用对象,因此正确的方法是:
class myclass {
protected function placeholders3($text, $count=0, $separator=","){
//...
}
public function log($key, $values) {
// ...
$question_marks[] = '(' . $this->placeholders3('?', sizeof($d)) . ')';
// ...
}
}
如果由于某种原因你不想创建类方法而你使用的是相对较新版本的PHP,你也可以使用lambda函数:
public function log($key, $values) {
$placeholders3 = function($text, $count=0, $separator=","){
// ...
};
// ...
$question_marks[] = '(' . $placeholders3('?', sizeof($d)) . ')';
// ...
}
答案 1 :(得分:0)
还有伙计们,请检查您的函数名称是否是PHP中的关键字,例如&#39; reset&#39; - 在这种情况下,它还会显示&#34;无法重新声明功能 &#34;错误