在阅读了有关参数化查询的相关问题之后,我意识到它们是完全(除非你内插表值或其他东西)防止SQL注入的方法,即使它们有点(好吧) ,非常)冗长和重复。但是,我一直在想如何正确地测试它们的错误处理,以及在某些情况下甚至是否需要错误处理。
很抱歉,如果这是一个新手问题,但不是PHP和MySQL安装在同一台服务器上?除非人们关心连接查询的语法或数据库连接代码或其他什么,否则我并不完全确定需要检查每个语句的错误,如:
if ($stmt->bind_param('s',$logon)) {
if ($stmt->execute()) {
if ($stmt->bind_result()) {
} else { return 'bat'; }
} else { return 'bar'; }
} else { return 'foo'; }
// or else:
$stmt->bind_param('s',$logon)) or trigger_error('Could not bind parameters!',E_USER_ERROR);
// etc.
作为旁注,如果由于某种原因$stmt
连接未关闭,而mysqli
连接是,那是否会导致某种内部服务器错误?或者关闭实际的mysqli
连接也可以做到这一点吗?为什么要首先关闭$stmt
?
无论如何,谢谢你的回应。
更新:MySQL参数化查询 - 缓存持续时间[重复] //关闭$ stmt是不必要的,因为PHP无论如何都会这样做。
备注:$stmt -> prepare(...)
与服务器进行交互。
答案 0 :(得分:0)
非常有帮助的AND
运算符可以帮助简化所有if-else
语句。虽然我确信还有其他更好的方法可以同时防止多个未捕获的异常,但这有望帮助其他寻求将来编写参数化查询的合理简单方法的人,或者实际上是嵌套查询:
// Procedural style:
$con = mysqli_connect('localhost','blah','foo','bar');
$query1 = "SELECT xyz FROM blah WHERE xyz = ?";
$username = 'ABC';
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
} else {
if (($stmt =
mysqli_stmt_init($con) ) and
mysqli_stmt_prepare($stmt,$query1) and
mysqli_stmt_bind_param($stmt,'s',$username) and
mysqli_stmt_execute($stmt) and
mysqli_stmt_bind_result($stmt,$name) and
( mysqli_stmt_fetch($stmt) !== FALSE) ) {
// Be careful of the functions that can return null
var_dump($name);
}
}
// Object Oriented Style:
$con = new mysqli('localhost','blah','foo','bar');
if ($con->connect_errno) {
printf("Connect failed: %s\n", $con->connect_error);
} else {
if ( ($stmt = $con->prepare($query1)) and
$stmt->bind_param('s',$username) and
$stmt->execute() and
$stmt->bind_result($name) and
($stmt->fetch() !== FALSE)) {
var_dump($name);
}
}