我将名称存储在名为' name'的数据库列中。使用以下功能:
public function insertCategory($arrCat) {
$id = $this->insert($arrCat);
return $id;
}
$arrCat
从我的控制器传递:
$arrCat = array(
'name' => addslashes($name),
'type' => $type,
'rank' => $catOrder,
'created_by' => $created_by,
'created' => Zend_Date::now()->toString('yyyy:MM:dd HH:mm:ss'),
'active' => 'y',
'app_id' => $appId
);
此代码正确插入数据。但我想要' name'要成为唯一值,所以我写了一个函数checkNameExists($ name,$ created_by,$ app_id):
public function checkNameExists($name,$created_by,$app_id) {
$sql= $this->_db->select("name")
->from("titles")
->where("name LIKE '" . addslashes($name) . "' AND created_by='" . $created_by . "' AND app_id = '".$app_id."' ");
//Tried with this query as well
//$sql="select name from titles where name = '$name' AND created_by=$created_by AND app_id=$app_id";
$result = $this->_db->fetchAll($sql);
if(count($result) > 0){
return 1;
} else {
return 0;
}
}
因此,根据 checkNameExists()返回的值,我想执行插入操作或向用户返回“已存在的名称”和“消息”。但是函数 checkNameExists 总是返回0,即使我的表中存在相同的名称。
我正在使用Zend Framework 1和MySQL。
答案 0 :(得分:2)
Zend_Db_Select
有一个很好的流畅界面。您需要做的第一件事是更好地使用其准备好的语句:
$sql = $this->_db->select()
->from('titles', array('name'))
->where('name = ?', $name)
->where('created_by = ?', $created_by)
->where('app_id = ?', $app_id);
这将有助于解决SQL注入问题。因为Zend_Db
在插入时使用预准备语句,所以您不需要使用addslashes
,只需将其传递给raw。这将简化从数据库中删除它,因为您不需要stripslashes
。另外,因为您要比较未删减的字符串,所以您需要的只是=
运算符,因为LIKE
仅在您使用%
作为通配符时才有效。
答案 1 :(得分:1)
您不应在某些数组或变量中使用addslashes或等效项,而只能在构建String查询时使用。
此外,您应该使用数据库的特定函数(例如,https://php.net/manual/en/mysqli.real-escape-string.php用于mysql)。
最后我认为你正在查询你的数据库有三个参数($ name,$ created_by,$ app_id),如果三个参数为true,函数checkNameExists会发送给你1,你能验证三个参数的值吗? / p>