如何检查使用addslashes添加的table中是否存在字符串?
How to check if string exists in table which is added using addslashes?
我正在使用以下函数将名称存储在名为 '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() 编辑的值 return,我想执行插入或 return 'Name already exists' 消息给用户。但是函数 checkNameExists 总是 returning 0 即使我的 table 中存在相同的名称。
我正在使用 Zend Framework 1 和 MySQL。
您不应在某些数组或变量中使用 addslashes 或等价物,而应仅在构建字符串查询时使用。
此外,您应该使用数据库的特定功能,例如(https://php.net/manual/en/mysqli.real-escape-string.php for mysql)。
最后,我认为您正在查询数据库的三个参数($name、$created_by、$app_id),如果这三个参数为真,函数 checkNameExists 将向您发送 1,您可以吗验证三个参数的值是否?
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
在插入的时候使用了prepared statements,所以不用addslashes
,直接传入raw即可。这将简化将其从数据库中取出的过程,因为您不需要 stripslashes
。此外,因为您正在比较未斜杠的字符串,所以您只需要 =
运算符,因为 LIKE
仅在您使用 %
作为通配符时才有效。
我正在使用以下函数将名称存储在名为 '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() 编辑的值 return,我想执行插入或 return 'Name already exists' 消息给用户。但是函数 checkNameExists 总是 returning 0 即使我的 table 中存在相同的名称。
我正在使用 Zend Framework 1 和 MySQL。
您不应在某些数组或变量中使用 addslashes 或等价物,而应仅在构建字符串查询时使用。
此外,您应该使用数据库的特定功能,例如(https://php.net/manual/en/mysqli.real-escape-string.php for mysql)。
最后,我认为您正在查询数据库的三个参数($name、$created_by、$app_id),如果这三个参数为真,函数 checkNameExists 将向您发送 1,您可以吗验证三个参数的值是否?
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
在插入的时候使用了prepared statements,所以不用addslashes
,直接传入raw即可。这将简化将其从数据库中取出的过程,因为您不需要 stripslashes
。此外,因为您正在比较未斜杠的字符串,所以您只需要 =
运算符,因为 LIKE
仅在您使用 %
作为通配符时才有效。