如何检查使用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 仅在您使用 % 作为通配符时才有效。