【问题标题】:mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in PHP [duplicate]mysqli_stmt::bind_result():绑定变量的数量与 PHP 中准备好的语句中的字段数量不匹配 [重复]
【发布时间】:2016-12-28 17:50:38
【问题描述】:

我正在尝试进行用户名搜索 [我似乎已经完成并且工作正常],但是当您搜索用户名时,将显示有关该帐户的信息。比如我搜索过virtualAnon,他的名字和first_name等信息会出现在他的用户名后面。

我尝试通过将$query = "SELECT username FROM users WHERE username like ? LIMIT 1"; 替换为$query = "SELECT * FROM users WHERE username like ? LIMIT 1"; 来修复它,但在我尝试之后,错误

mysqli_stmt::bind_result(): 绑定变量数不匹配 PHP中准备好的语句中的字段数

出现了。

这是获取用户名和数据库的 PHP 文件:

<?php
    if($_GET['keyword'] && !empty($_GET['keyword']))
    {
        $conn = mysqli_connect('localhost','root','','loginsecure'); //Connection to my database
        $keyword = $_GET['keyword'];
        $search = $_GET['keyword'];
        $keyword="%$keyword%";
        $query = "SELECT * FROM users WHERE username like ? LIMIT 1";
        # When I tried to SELECT *, It gives me the error of: Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in ...\fetch.php on line 22
        $statement = $conn->prepare($query);
        $statement->bind_param('s',$keyword);
        $statement->execute();
        $statement->store_result();
        if($statement->num_rows() == 0) // so if we have 0 records acc. to keyword display no records found
        {
            echo '<div id="item">Sorry, but there is no user "'.$search.'" found in our database :(</div>';
            $statement->close();
            $conn->close();

        }
        else {
            $statement->bind_result($name); # There is a error i'm encountering when I try to Select * from the line 8.
            while ($statement->fetch()) //outputs the records
            {
                echo "<div id='item'><a href=\"../user/username.php?username=$name\">$name</a></div>";
                # It supposed to show more information about the user, by using $name['first_name'] or $name['last_name']
            };
            $statement->close();
            $conn->close();
        };
    };
?>

【问题讨论】:

  • if($_GET['keyword'] &amp;&amp; !empty($_GET['keyword'])) 是不可取的。只需删除第一个检查并完全依赖第二个检查。这样您就可以防止生成通知。

标签: php mysqli prepared-statement


【解决方案1】:

您遇到的问题是mysqli_stmt::bind_result 将尝试将结果集中的每一列绑定到一个变量。这意味着您需要与列相同数量的变量。如果返回了两列,则需要将它们绑定到两个变量。

$statement-&gt;bind_result($name); 中,您说“只有一列,所以将其绑定到$name 而您的查询 (SELECT * FROM users WHERE username like ? LIMIT 1) 正在获取所有列那张桌子。

因此,解决方案是在这种情况下只选择您想要的单数列。替换

SELECT name 

SELECT *

【讨论】:

  • 抱歉,我创建了一个新变量,即$namequery = "SELECT first_name FROM users";,并将$statement = $conn-&gt;prepare($query); 更改为$statement = $conn-&gt;prepare($query, $namequery);。现在它会抛出 Warning: mysqli::prepare() 需要恰好 1 个参数,2Fatal error: Call to a member function bind_param() on null的错误跨度>
  • 好吧,你一次只能准备一个查询。它们每个都有自己的语句,因此您不能准备两个查询并最终得到一个语句。话虽如此,您不需要 new 查询,只需将 $query 更改为 $query = "SELECT first_name FROM users WHERE username like ? LIMIT 1";
  • 我使用了你的代码,它可以工作。但唯一的事情是我只想显示用户名用户名。
  • 因此,如果您阅读了 PHP Manual on bind result 的链接,请在您的 SELECT 语句中定义您想要的两列 (SELECT first_name, username ...),然后在两个变量上使用 bind_result ( $statement-&gt;bind_result($name, $otherColumn)。查看我的答案中的手动链接,它会更详细地解释
猜你喜欢
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多