如何检查表中是否存在使用addslashes添加的字符串?

时间:2015-04-27 10:55:35

标签: php mysql zend-framework

我将名称存储在名为' 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。

2 个答案:

答案 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>