2

我正在使用两个输入参数调用一个 mysql 存储过程。这是我的代码:

if (isset($_POST['button1'])) {
    $con = mysql_connect("localhost:3306","root","");
    if (!$con) {     
        echo '<b>Could not connect.</b>';
        die(mysql_error()); // TODO: better error handling
    } else {          
        mysql_select_db("php_database_1", $con);

        $username_v = $_POST['username'];
        $password_v = $_POST['password'];

        $stmt = $dbh->prepare("CALL login(?, ?)");
        $stmt->bindParam(2, $username_v, $password_v, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

        // call the stored procedure
        $stmt->execute();

        print "procedure returned $username_v\n";

执行时,我得到:

注意:未定义变量:第 52 行 E:\xampp\htdocs\php4\default.php 中的 dbh 致命错误:在 E:\xampp\htdocs\php4\default 中的非对象上调用成员函数 prepare()。第 52 行的 php

我怎样才能解决这个问题?

谢谢。

4

3 回答 3

7

编辑:在看到更多代码后,您尝试将这些mysql_()功能与 PDO 混合。你不能这样做——相反,只能使用 PDO。这两个 API 不能一起工作,旧的mysql_*()API 根本不支持预处理语句。

您尚未连接到数据库或实例化 PDO 对象。

$username_v = $_POST['username'];
$password_v = $_POST['password'];
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

// You must first connect to the database by instantiating a PDO object
try {
    $dbh = new PDO($dsn, 'root', 'root_db_pw');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// Then you can prepare a statement and execute it.    
$stmt = $dbh->prepare("CALL login(?, ?)");
// One bindParam() call per parameter
$stmt->bindParam(1, $username_v, PDO::PARAM_STR); 
$stmt->bindParam(2, $password_v, PDO::PARAM_STR); 

// call the stored procedure
$stmt->execute();
于 2012-05-14T18:52:07.607 回答
0

在为另一项任务尝试了 Michaels 解决方案并且 CALL 程序告诉它预期 0 参数并得到 2 时惨遭失败,我将把这个解决方法留给其他有同样问题的人:

$username_v = $_POST['username'];
$password_v = $_POST['password'];
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

// You must first connect to the database by instantiating a PDO object
try {
    $dbh = new PDO($dsn, 'root', 'root_db_pw');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// Then you can prepare a statement and execute it.    
$stmt = $dbh->prepare("SET @username_v = '$username_v'; SET @password_v = '$password_v';  CALL login()");

// call the stored procedure
$stmt->execute();
于 2018-04-11T08:28:36.080 回答
0

如果您想在没有 PDO 的情况下使用 IN 参数调用存储过程,那么下面的代码可能会对您有所帮助。

$stmt = $conn->prepare("CALL dataCreation(?)");
mysqli_stmt_bind_param($stmt, "s", $lastDate);
mysqli_stmt_execute($stmt);

希望这会对某人有所帮助。

于 2019-10-13T13:33:06.793 回答