如何在PHP中使用mysqli预处理语句?

aWe*_*per 5 php mysql mysqli

我正在尝试准备好的语句,但下面的代码不起作用.我收到错误:

致命错误:在第12行的/var/www/prepared.php中调用非对象的成员函数execute()

<?php

    $mysqli = new mysqli("localhost", "root", "root", "test");
    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    }

    $stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");

    // insert one row
    $stmt->execute(array('one',1));

    // insert another row with different values
    $stmt->execute(array('two',1));
?>
Run Code Online (Sandbox Code Playgroud)

另外,我是否需要使用mysqli来准备语句?任何人都能指出我从连接到插入到错误处理选择的预准备语句的完整示例吗?

mat*_*fee 10

fdsa来自mysqli::prepare文档:

在执行语句或获取行之前,必须使用mysqli_stmt_bind_param()和/或mysqli_stmt_bind_result()将参数标记绑定到应用程序变量.

bind_paramdocs.

即:

$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");

// bind parameters. I'm guessing 'string' & 'integer', but read documentation.
$stmt->bind_param('si','one',1);

// *now* we can execute
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)


pro*_*son 7

我还需要使用mysqli来准备语句.任何人都可以指出一个关于准备语句的完整示例,从连接到插入到选择和错误处理

你也可以使用我更喜欢的PDO.事实上,在您的代码示例中,您似乎混淆了PDO和Mysqli.

$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (?,?)");
$stmt->execute(array($name1, $age1));
$stmt->execute(array($name2, $age2));
Run Code Online (Sandbox Code Playgroud)

与mysqli不同,您不必调用单独的绑定功能,但如果您喜欢/想要/需要使用它,则可以使用该功能.

关于PDO的另一个有趣的事情是命名占位符,它在复杂查询中可以更少混淆:

$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (:name,:age)");
$stmt->execute(array(':name' => $name1, ':age' => $age1));
$stmt->execute(array(':name' => $name2, ':age' => $age2));
Run Code Online (Sandbox Code Playgroud)