代码之家  ›  专栏  ›  技术社区  ›  Z Davies

绑定参数错误

  •  -1
  • Z Davies  · 技术社区  · 9 年前

    我的链接缩短器出现MySQL/MySQLi/PHP错误,错误是:

    Fatal error: Call to a member function bind_param() on a non-object in
    /home/exabit/public_html/9ui/index.php on line 50
    

    这是有问题的一行。

    $reslove->bind_param("ss",$link, $short_url);
    

    这是代码的其余部分

    <?php
    $data_base = new mysqli ("http://host38.qnop.net/~exab","exab_ml","MKnOz3A]h~aw","exab_ml");
    function generateRandomString($length = 3) {
    $key = 'abcdefghijklmnopqrstuvwxyz1234567890';
    $keyLength = strlen($key);
    $string = '';
    for ($i = 0; $i < $length; $i++) {
    $string .= $key[rand(0, $keyLength - 1)];
    }
    return $string;
    }
    if (isset($_GET['title'])) {
    $reslove = $data_base->prepare("SELECT * FROM links WHERE title=?");
    $reslove->bind_param("s", $_GET['title']);
    $reslove->execute();
    $goto = $reslove->get_result()->fetch_array();
    $goto1 = $goto[1];
    header("Location: $goto1");
    }
    if (isset($_POST['submit'])) {
    $short_url = generateRandomString();
    if (!preg_match("/^(http|https):/", $_POST['long_url'])) {
    $_POST['long_url'] = 'http://'.$_POST['long_url'];
    }
    $link = $_POST['long_url'];
    $reslove = $data_base->prepare("INSERT INTO links VALUES('',?,?)");
    $reslove->bind_param("ss",$link, $short_url);
    $reslove->execute();
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    <center>
    <form>
    <p style="color:#05ff19;font-family:Tahoma;font-size:16px;text-align:center">Shortened Link: </p><input id=shortenedurl style="background-color:#000;color:#05ff19;font-family:Tahoma;font-size:16px;vertical-align:middle;border:1px solid #05ff19" type="text" value=<?php echo "9ui.co/$short_url";}?>'>
    </form>
    </center>
    

    决心的拼写错误与此无关。
    提前感谢,
    扎克·戴维斯

    2 回复  |  直到 9 年前
        1
  •  2
  •   BareNakedCoder    9 年前

    错误“调用非对象上的成员函数bind_param()”意味着 $reslove 不是对象,因此不能对不是对象的对象调用成员函数(又名方法)。如何才能 $resolve 不是物体?嗯 ->prepare 第49行的方法调用将返回 false 如果在准备SQL语句时出错, 是一个“非对象”,所以这将导致您收到错误消息。

    查看第49行,其中 $解决 设置好了,嗯,SQL语句看起来很有趣。INSERT命令的语法通常是。。。

    INSERT INTO table_name (column1,column2,column3,...)
    VALUES (value1,value2,value3,...);
    

    你遗漏了 (column1,column2,column3,...) 它明确地说明列名及其顺序。如果不考虑这一点,如果它真的起作用的话,那么这是有风险的和/或脆弱的,因为您会假设列与您的值匹配,但情况可能并不总是如此。明确声明 (第1列、第2列、第3列…) .

        2
  •  0
  •   Alaa M. Jaddou    9 年前

    只要改变这个

    $reslove->bind_param("ss",$link, $short_url);
    

    $reslove->bind_param($link, $short_url);
    

    使现代化

    在prepare语句中添加列名,然后给它们一个如下的值

    $reslove = $data_base->prepare("INSERT INTO links (id, link, short_url) VALUES(?,?,?)");
    $reslove->bind_param('',$link, $short_url);