代码之家  ›  专栏  ›  技术社区  ›  Fábio Antunes

bindparam()中的mysqli-prepared语句不工作

  •  7
  • Fábio Antunes  · 技术社区  · 15 年前

    和往常一样,我也在研究使用PHP的最佳实践,而准备好的语句似乎是我闭上眼睛应该做的事情。所以我开始用我发现的一些例子来做游戏。

    运行脚本时出现此错误:

    致命错误:调用成员函数 中非对象的bindparam()。 /opt/lampp/htdocs/phpsecurity/preparedstations/插入多绑定参数/插入 第10行的simple method.php

    这里是代码。

    插入simple method.php

    <?php
    require_once '../config.php';
    
    $stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
    
    $nome = 'Fabio Antunes';
    $telefone = 916810641;
    $bi = 123093456;
    
    $stmt->bindParam(1, $nome);
    $stmt->bindParam(2, $telefone);
    $stmt->bindParam(3, $bi);
    
    $stmt->execute();
    
    $stmt->close();
    
    $db->close();
    ?>
    

    组态PHP

    <?php
    $server_host = 'localhost';
    $server_user = 'root';
    $server_password = '';
    $server_db = 'PreparedStatements';
    $db = new mysqli($server_host, $server_user, $server_password, $server_db);
    ?>
    

    不知道我在这里做错了什么,这是在php.net上发现的类似例子,为什么不工作? PS:我认为mysqli连接不是问题所在,因为我已经用它对select-sql命令执行了一些准备好的语句。工作得很好。


    编辑

    决议和原因。

    井在 example 我应该用 bind_param() 查询中的每个值。但多亏了巴特,他用我的代码解决了这个问题。

    它在哪里:

    $stmt->bindParam(1, $nome);
    $stmt->bindParam(2, $telefone);
    $stmt->bindParam(3, $bi);
    

    应该是:

    $stmt->bind_param("sii", $nome, $telefone, $bi);
    

    现在,对于那些想知道什么是“sii”的人来说。

    好吧,把参数绑定到我看到的内容上,它将“$var”绑定到每个问号“?整齐。

    所以一个 宾达PARAMP() 我可以同时装订它们,并且正常使用 绑定参数() 要求指定要绑定的数据类型。

    我要绑定的第一个值是 $nome 由“s”指定的字符串;

    还有其他人 $telefone $bi 是整数,因为他有“i”;

    对于这里有类似问题的其他数据类型(从php.net)。

    i=整数;

    S=字符串;

    d=双;

    B=BLB;

    如果有人作为更好的解释,请张贴或评论。所以我可以提高自己。

    谢谢。

    2 回复  |  直到 13 年前
        1
  •  6
  •   Bart Kiers    15 年前

    您可能认为连接没有问题,但应检查以确保:

    $db = new mysqli($server_host, $server_user, $server_password, $server_db);
    if (mysqli_connect_errno()) {
        printf("DB error: %s", mysqli_connect_error());
        exit();
    }
    

    编辑:

    当你这样做时会发生什么:

    $stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
    $stmt->bind_param("sii", $nome, $telefone, $bi);
    $stmt->execute();
    

    ?

    是桌子 coisas 拼写正确?

        2
  •  2
  •   Zak    15 年前

    在第4行得到$stmt之后,在上面打印一份。是真的吗?我想不行。