【问题标题】:Is it possible to bind parameters to stored procedure in MYSQLi?是否可以将参数绑定到 MYSQLi 中的存储过程?
【发布时间】:2012-08-02 18:17:39
【问题描述】:

我从这里http://php.net/manual/en/mysqli.quickstart.stored-procedures.php 一直在阅读存储过程和 MYSQLi

和其他来源,但我仍然不确定如何使用? 调用存储过程(如准备好的语句)

是否可以将参数绑定到存储过程,类似于:

$mysqli->query("CREATE PROCEDURE p(IN id_var INT) BEGIN INSERT INTO test(id)
         VALUES(id_var); END;"))
$mysqli->bindParam("i", $some_int);
$mysqli->query("CALL p");

【问题讨论】:

    标签: php stored-procedures mysqli


    【解决方案1】:

    绑定参数是PHP端的操作;存储过程是 MySQL 的东西。两者没有关系,不应该这样对待。

    使用准备好的语句和参数绑定,您可以使用prepare() 方法定义查询,然后使用bind_param() 将值绑定到?s。因此,鉴于您的示例,准备好的语句方法如下所示:

    $stmt = $mysqli->prepare("INSERT INTO test (id) VALUES (?)");
    $stmt->bind_param('i', $some_int);
    $stmt->execute();
    

    另一方面,对于存储过程,您只需将其称为 using the CALL command 作为普通查询:

    //procedure created beforehand
    CREATE PROCEDURE p(IN id_var INT)
    INSERT INTO test (id)
    VALUES (id_var);
    //now in PHP:
    $mysqli->query("CALL p($some_int)");
    

    我不确定您是否可以使用query() 方法运行CREATE PROCEDURE

    所以回答你的问题:是的,可以同时使用两者(因为它们是不同的东西),但不是以你想象的方式,这将是多余的。

    【讨论】:

    • in $mysqli->query("CALL p($some_int)"); 是否需要在传递值之前对其进行转义?
    • 是的,因为那不是准备好的语句。但是,过程定义确实id_var 声明为INT,因此如果您尝试输入字符,它很可能会失败。
    • 如果您从用户输入中获得$some_int,您仍然需要确保它是一个int,否则您可以轻松获得0); DROP TABLE etc...-- 字符串作为输入...
    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多