从简单查询切换到预准备语句

时间:2017-10-26 09:11:53

标签: php mysqli prepared-statement

所以这是我第一次尝试将一些以前使用过的代码转换为预处理语句,以防止SQL注入。我正在使用mysqli程序,如下所示,

旧查询:

mysqli_query($con,"UPDATE ulogs SET invalid_hits = invalid_hits + 1 WHERE user_id = $link AND date = '$date'"); 
if(mysqli_affected_rows($con) < 1) {            
mysqli_query($con,"INSERT INTO ulogs(user_id,date,invalid_hits,unique_hits,non_unique_hits,earned,ref_earned,bonus) VALUES ('$link','$date',1,0,0,0,0,0)");
}

准备好的查询:

 $q1 = "UPDATE ulogs SET invalid_hits = invalid_hits + 1 WHERE user_id =? AND date =?";
$qa1 = "INSERT INTO ulogs (user_id,date,invalid_hits,unique_hits,non_unique_hits,earned,ref_earned,bonus) VALUES (?,?,1,0,0,0,0,0)";


if ($stmt = mysqli_prepare($con, $q1)) {
    mysqli_stmt_bind_param($stmt,"is", $link, $date);
    mysqli_stmt_execute($stmt);
    $ucheck = mysqli_stmt_affected_rows($stmt);
    mysqli_stmt_close($stmt);
}
if ($ucheck < 1) {
    if ($stmt = mysqli_prepare($con, $qa1)) {
        mysqli_stmt_bind_param($stmt,"is", $link, $date);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_close($stmt);
    }
}

mysqli_close($con);
exit();

还有更多在不同情况下被触发但首先基本相同的UPDATE,然后INSERT如果没有更新。 显然它起作用,因为我根据php.net的例子进行查询。显然... 因为,大约1小时后,Apache在等待来自数据库的数据时返回了500个服务器错误并且php超时。鉴于未准备好的查询,这种事情从未发生过。

所以问题是:我在这里做错了吗? $ stmt每次都被关闭,还有$ con所以我不知道是什么导致数据库挂起。请注意,服务器负载也没有上升。只是php-fpm到达最大客户端正在等待数据库的进程。

1 个答案:

答案 0 :(得分:0)

尽管我仍然找不到为什么准备好的语句的原始代码最终在数小时后崩溃了,但我最终还是通过使用一个流行的类专门为开箱即用的替代方法找到了一个简单的方法为此:https://github.com/colshrapnel/safemysql

此类非常简单,因此即使像我这样的新手也可以使用其Github页面上的示例来实现它。

特别感谢@YourCommonSense向我指出正确的方向。