PHP MySQLi prepared语句似乎不绑定或传递变量,但可以与PDO prepare一起使用

PHP MySQLi prepared语句似乎不绑定或传递变量,但可以与PDO prepare一起使用,php,mysqli,pdo,prepared-statement,mariadb,Php,Mysqli,Pdo,Prepared Statement,Mariadb,我在一个最近停止工作的应用程序上遇到了一些问题,我不知道可能是什么问题 从数据库读取工作正常,但当我尝试插入或更新现有记录时,它不起作用。有时,记录字段值被设置为null,而不是变量值 该应用程序目前正在共享主机上运行,几个月来一直运行良好,直到一周前。我将UAT实例放在另一个主机上,与另一个提供商一起使用,它似乎可以正常工作 在我的调查过程中,我注意到,如果我通过标准的PHP MYSQLi过程语句更新或插入记录,那么该记录被正确更新/插入,但是当我尝试通过准备好的语句绑定它时,它就不起作用了

我在一个最近停止工作的应用程序上遇到了一些问题,我不知道可能是什么问题

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

该应用程序目前正在共享主机上运行,几个月来一直运行良好,直到一周前。我将UAT实例放在另一个主机上,与另一个提供商一起使用,它似乎可以正常工作

在我的调查过程中,我注意到,如果我通过标准的PHP MYSQLi过程语句更新或插入记录,那么该记录被正确更新/插入,但是当我尝试通过准备好的语句绑定它时,它就不起作用了

PHP/MySQL没有抛出任何错误

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

这项工作:

如果数据库表中的第一个_名称有一个值,并且我运行脚本输出行数,它将返回“受影响的行1”。当我检查数据库时,我可以看到该值现在为空

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

更新1

刚刚添加了var_dump$stmt,$firstname;在bind之后添加第二个示例

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

受影响的行: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;

?>
当我尝试执行一个准备好的语句进行选择时,我得到一个“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扩展似乎已被禁用。启用它后,上面的示例可以正常工作,我的应用程序现在可以正常工作。

FWIW,HTML与SQL无关。您不应该为SQL查询使用HTML转义值。在第一段代码中,这导致查询仍然对SQL注入开放。第二个查询是安全的,但是现在您遇到了一个问题,就是在数据库中没有很好的理由就有HTML编码的数据。这些只是我从在线教程中复制的简单示例。我不会在我的应用程序中以这种方式逃逸。@Mkov请编辑您的问题,将您的实际代码包含在应用程序中。请看上面的代码,这是我用来调试错误的代码。这当前与我的应用程序处于相同的环境中。@Mkov var_dump$stmt,$firstname;在bind_param调用之后?如果有一个受影响的行,如果没有受影响的行,您得到的输出是什么?
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" 
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" 
<?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;

?>
<?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);
?>