为什么bind_param()在while循环中不起作用?返回致命错误

时间:2016-04-05 13:51:07

标签: php mysqli prepared-statement

为什么我的bind_param()循环中的while无法正常工作? 我得到了

  

致命错误:在...

中的非对象上调用成员函数bind_param()

我在这里要做的是显示user表中的所有数据(如果$key未设置),那么,
我想使用if语句来区分显示的值。我试图在数据库管理器中执行准备好的查询,它的工作原理。但在这种情况下..我的查询似乎返回false。那么,任何想法?这是代码,

function cariTemen($key) {
    require 'settings.php';
    $my_id = $_SESSION['user_id'];

    $stmt = $conn->prepare ("SELECT user_id,nama_asli FROM user WHERE username LIKE ? OR nama_asli LIKE ?");
    $key = '%'.$key.'%';
    $stmt->bind_param('ss',$key,$key);
    $stmt->execute();
    $stmt->bind_result($id,$nama);

    //MODIFIED FROM HERE
    while($stmt->fetch()) {
        $temen_id = $id;
        $username = $nama;

        $temen = $conn->prepare("SELECT id_temenan FROM temenan WHERE temen_id = ? AND user_id = ?");
        $temen->bind_param('ii',$temen_id,$my_id); //ERROR IS HERE
        $temen->execute();
        $temen->store_result();
        $jml= $temen->num_rows;

        if($jml > 0) {

            echo $username.' [Temenan]<br>';

        } else {

            echo $username.' <a href="add.php?user_id='.$temen_id.'"">Temenin</a><br>';
        }
    }

    $stmt->close();
}

提前感谢您提供的任何帮助。

as marcellorvalle表示mysql无法同时维护2个查询,在这种情况下,我需要将所有值存储到array()变量中。所以脚本会是这样的:

$user_id = array(); 
$username = array();
$i = 0;

while($stmt->fetch()) {
    $user_id[$i] = $id;
    $username[$i] = $nama;
    $i++;
}

$stmt->close();

for ($j= 0 ; $j <= $i; $j++) {
    $temen = $conn->prepare("SELECT id_temenan FROM temenan WHERE temen_id = ? AND user_id = ?");
    $temen->bind_param('ii',$user_id[$j],$my_id);
    $temen->execute();
    $temen->store_result();
    $jml= $temen->num_rows;

    if($jml > 0) {

        echo  '<a href="profil.php?user_id='.$user_id[$j].'"">'.$username[$j].'</a> [TeMeNan]<br>';

    } else {

        echo ' <a href="profil.php?user_id='.$user_id[$j].'"">'.$username[$j].'</a> <a href="add.php?user_id='.$user_id[$j].'"">[TeMeNin]</a><br>';

    }

}
$temen->close();

2 个答案:

答案 0 :(得分:0)

  1. bind_param()不起作用,prepare()
  2. 它不起作用,因为默认情况下准备好的查询是无缓冲的,因此为了在你没有得到第一个查询的所有结果时运行另一个查询,你必须在第一个上调用store_result()先查询。
  3. 执行嵌套查询时,100次中的99次,表示您应该使用JOIN
  4. 运行单个查询

答案 1 :(得分:-1)

根据消息,$ temen似乎不是一个对象。尝试使用var_dump($ temen)调试它。似乎$ conn-&gt; prepare因某种原因返回 false false 不是对象。

您可以检查回显$ conn-&gt;错误的任何错误,看看发生了什么。