PHP MySQLi 预准备语句似乎不绑定或传递变量 - 但适用于 PDO prepare

PHP MySQLi prepared statements don't appear to bind or pass variables - but works with PDO prepare

我在使用最近停止工作的应用程序时遇到了一些问题,我无法弄清楚可能是什么问题。

从数据库读取工作正常,但是当我尝试插入或更新现有记录时,它不起作用。有时记录字段值被设置为 null 而不是变量值。

此应用程序目前 运行 在共享主机上运行,​​并且在一周前之前几个月都运行良好。我将 UAT 实例与另一个提供商一起放在另一台主机上,它似乎可以正常工作。

在我的调查过程中,我注意到如果我通过标准 PHP MYSQLi 程序语句更新或插入记录是正确的 updated/inserted,但是当我尝试通过准备好的方法绑定它时声明它不起作用。

PHP/MySQL没有抛出任何错误。

我尝试通过创建一个简单的测试脚本来简化事情,该脚本用一个值更新一条记录。

有效:

<?php
    // Connection file
    require 'connection.php';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // set parameters and execute
    $firstname = htmlspecialchars($_GET["firstname"]);

    $sql = "UPDATE users SET first_name='$firstname' WHERE uid=1";

    if ($conn->query($sql) === TRUE) {
        echo "Updated record successfully";
    } else {
        echo "Error updating record: " . $conn->error;
    }

    $conn->close();
    ?>

虽然这不是:

<?php
    // Connection file
    require 'connection.php';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // set parameters and execute
    $firstname = htmlspecialchars($_GET["firstname"]);

    // prepare and bind
    $stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid =1");
    $stmt->bind_param("s", $firstname);


    $stmt->execute();

    echo "Updated record successfully";

    $stmt->close();
    $conn->close();
    ?>

我正在 运行宁 PHP v7.0.30、Apache v2.4.33 和 MySQL v10.2.15 (MariaDB)

任何想法。这让我发疯...

我刚刚尝试为第二个示例返回受影响的行数。

printf("Affected rows (UPDATE): %d\n", $stmt ->affected_rows);

如果数据库table中的first_name有值,我运行脚本输出行数,它returns 'Affected rows 1'。当我检查数据库时,我可以看到该值现在为空。

这可能是什么原因造成的?可能是某种编码问题?

更新 1

刚刚添加 var_dump($stmt, $firstname);绑定后的第二个例子。

object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(0) } string(3) "Bob" 

受影响的行:1

object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(0) } string(4) "Jack" 

受影响的行:0`

更新 2

我开始认为这是服务器问题。 我刚刚测试了使用 PDO prepare 更新记录并且它正在运行。

<?php
    // Connection file
    require 'connection.php';

    // set parameters
    $firstname = $_GET["firstname"];
    $id = 1;

    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // prepare sql and bind parameters
        $stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid=?");
        $stmt->execute([$firstname,$id]);

        }
    catch(PDOException $e)
        {
        echo "Error: " . $e->getMessage();
        }
    $conn = null;

?>

当我尝试对 SELECT 执行准备好的语句时,我收到“503 服务不可用”。在本地工作正常。

<?php
    // Connection file
    require 'connection.php';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // set parameters and execute
    $id = 1;

    //create a prepared statement
    $query = "SELECT first_name FROM users WHERE uid=?";
    $stmt  = $conn->prepare($query);

    $stmt ->bind_param('i', $id);

    //execute query
    $stmt ->execute();

    //bind result variables
    $stmt ->bind_result($first_name);

    //fetch records
    while($stmt ->fetch()) {
        print $first_name;
    }   

    //close connection
    $stmt ->close();

    mysqli_close($conn);
?>

最终更新 - 问题已解决

我的托管服务提供商能够解决这个问题。 nd_mysqli PHP 扩展似乎被禁用了。有了它,上面的例子就可以工作了,我的应用程序现在可以运行了。

最终更新 - 问题已解决

我的托管服务提供商能够解决该问题。 nd_mysqli PHP 扩展似乎被禁用了。有了它,上面的例子就可以工作了,我的应用程序现在可以运行了。