mysqli的错误实现


Wrong implementation of mysqli?

我第一次尝试使用mysqli,因为我在一个php文件中使用多个Query时遇到了一些问题。首先,我只是试图从存储过程中检索数据并打印它。但看起来代码卡在了某个地方,它打印了"successful localhost",但它从未访问过下面的代码。数据从未打印过,也没有失败。

    <?php
$link = mysqli_init();
if (!$link) {
    die('mysqli_init failed');
}
if (!mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
    die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
    die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!mysqli_real_connect($link, 'localhost', 'root', '', 'fabiola')) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}
echo 'Success... ' . mysqli_get_host_info($link) . "'n";

//require 'header.php';
$resID = mysqli_real_escape_string($_REQUEST['resID']);
$materialen_id = mysqli_real_escape_string($_REQUEST['materialen_id']);
$aantal = mysqli_real_escape_string($_REQUEST['aantal']);
$effectief_gebruikt = mysqli_real_escape_string($_REQUEST['effectief_gebruikt']);
$opmerking = mysqli_real_escape_string($_REQUEST['opmerking']);
$datum_van = $_REQUEST['datum_van'];
$datum_tot = $_REQUEST['datum_tot'];

$sqm = "CALL aantal_besch_mat_van_tot($datum_van,$datum_tot,$materialen_id,$resID)";
//$result = $mysqli->query($sqm) or die('Query Failed!');
/* Select queries return a resultset */
if ($result = $mysqli->query($sqm)) {
    printf("Select returned %d rows.'n", mysqli_num_rows($result));
    /* free result set */
    mysqli_free_result($result);
}else{
    echo 'failed';
}

mysqli_close($link);

?>

$mysqli在哪里设置或初始化?

应该有这样的东西:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

但我看不见。

顺便说一句,奇怪的是,你把函数调用约定"mysqli_real_escape_string(…)"和面向对象的函数"$mysqli->query(…))"混合在一起。我不确定两者都做是否安全。

此外,通过使用MySQLi准备的语句,而不是试图手动确保所有输入的安全,例如,你会省去很多心痛

$query = "CALL aantal_besch_mat_van_tot(?, ?, ?, ?);";
$statement = $mysqli->prepareStatement($query);
$statement->bind_param('iiii', $datum_van, $datum_tot, $materialen_id, $resID);
$statement->execute();
//get the results.
$statement->close();
$mysqli->close();

使用准备好的语句(以百分之几的性能为代价)要容易得多,也更安全,所以实际上你几乎应该总是使用它们。