将普通的OOP SQLi语句转换为预处理语句

时间:2018-10-14 07:56:53

标签: php mysqli prepared-statement

我有以下普通的User类语句,我试图将其转换为准备好的语句。

public function didReceiveRequest($user_from) {
    $user_to = $this->user['username'];
    $check_request_query = mysqli_query($this->con, "SELECT * FROM friend_requests WHERE user_to='$user_to' AND user_from='$user_from'");
    if (mysqli_num_rows($check_request_query) > 0) {
        return true;
    }
    else {
        return false;
    }
}

我对准备好的语句并不陌生,并且在User类中的表现一直不错,但是仍然遇到一些麻烦。作为新手,我也不遵循逻辑,所以请放轻松。这是我到目前为止的内容:

public function didReceiveRequest($user_from){
   $user_to = $this->user['username'];
   $check_request = $this->con->stmt_init();
   $check_request->prepare('SELECT * FROM friend_requests WHERE user_to=? AND user_from=?');

   $check_request->bind_param('ss', $user_to, $user_from);
   $check_request->execute();

   $result = check_request->get_result();
   $data = $result->fetch_assoc();

   $check_request->free_result();
   $check_request->close();

   if($data > 0){
      return true;
   }else{
      return false;}
}

因此,有几件事说明了这一点:1)我知道可能有一种更好,更有效的方法。 2)请问我返回的结果是否与以前(使用普通语句)返回的结果相同。我不想混淆来自相关页面的呼叫。

2 个答案:

答案 0 :(得分:0)

在这里,您将如何使用MySqli准备的语句作为案例。

public function didReceiveRequest($user_from) {

$query = "SELECT * 
FROM friend_requests 
WHERE user_to = ? AND user_from = ?";

$user_to = $this->user['username'];

$stmt = $this->con->prepare($query);
$stmt->bind_param(ss, $user_to, $user_from); //set your bindings
$stmt->execute();
//$results = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);//Use if you want to see results.

if($stmt->num_rows !== 0) {
return TRUE;
}else{
  return FALSE;
  }

}

这是一个非常好的阅读链接,它教您如何在MySqli中使用预准备的语句。我会将此链接添加为书签并经常引用。 MySqli prepared statements

使用准备好的语句不会影响您从查询中接收结果的方式。

答案 1 :(得分:0)

我看到的提供的答案是$result = $stmt->get_result();的不同之处再次是准备好的语句的新手,我不是100%认为这是上面的代码引发错误的原因,但是该代码有效。

 public function didReceiveRequest($user_from) {
    $user_to = $this->user['username'];
    $stmt = $this->con->stmt_init();
    $stmt->prepare('SELECT * FROM friend_requests WHERE user_to=? AND user_from=?');

    $stmt->bind_param('ss', $user_to, $user_from);
    $stmt->execute();

    $result = $stmt->get_result();
    $qty = $result->num_rows;

    $stmt->free_result();
    $stmt->close();

    if($qty > 0) {
        return true;
    }else{
        return false;
    }

}