2017-08-23 5 views
0

この質問は何度も尋ねられていますが、解決策は私にとっては効果がないようです。非オブジェクトのプロパティを取得しようとしている/ booleanのメンバー関数bind_param()を呼び出す

私は簡単なブログを書いています。私はアーカイブセクションを作りたがっていましたが、私は立ち往生しました。これは私が持っているコードの一部であり、それは面倒です:

  $month = $_GET['month']; 
      $year = $_GET['year']; 

      $from = date('Y-m-01 00:00:00', strtotime("$year-$month")); 
      $to = date('Y-m-31 23:59:59', strtotime("$year-$month")); 

      echo $from; 
      echo $to; 

      $sql = "SELECT * FROM posts WHERE date >= ".$from." AND date <= ".$to." ORDER BY date DESC"; 
      $stmt = $conn->query($sql); 
      var_dump($stmt); 

      if($stmt->num_rows > 0){ 
       while($row = $stmt->fetch_assoc()){ 

とコードのこの作品は、(非オブジェクトのプロパティを取得しようとする)if文の中で私に次のエラーを与えています。 var_dump()はbool(false)を返します。だから、クエリは問題だと思われますが、限り私はそれが大丈夫です懸念している。私はそれをチェックし、タイプミスはなく、すべての名前も正しいです。

また、私はこのようにそれを実行しようとしました:

  $month = $_GET['month']; 
      $year = $_GET['year']; 

      $from = date('Y-m-01 00:00:00', strtotime("$year-$month")); 
      $to = date('Y-m-31 23:59:59', strtotime("$year-$month")); 

      echo $from; 
      echo $to; 

      $sql = "SELECT * FROM posts WHERE date >= ".$from." AND date <= ".$to." ORDER BY date DESC"; 
      $stmt = $conn->prepare($sql); 
      var_dump($stmt); 
      $stmt->bind_param('ii', $from, $to); 
      $stmt->execute(); 

しかし、それは私に(ブールのメンバ関数のbind_paramへの呼び出し())別のエラーになりますので、再度、クエリが問題となっているようです。私は本当にこれに対処する方法を知らない。助言がありますか?

UPDATE:

   $month = $_GET['month']; 
      $year = $_GET['year']; 

      //set from and to dates 
      $from = date('Y-m-01 00:00:00', strtotime("$year-$month")); 
      $to = date('Y-m-31 23:59:59', strtotime("$year-$month")); 

      echo $from; 
      echo $to; 

      $sql = "SELECT * FROM posts WHERE date >= ? AND date <= ? ORDER BY date DESC"; 
      $stmt = $conn->prepare($sql); 
      //var_dump($stmt); 
      $stmt->bind_param('ii', $from, $to); 
      $stmt->execute(); 

      if($stmt->num_rows > 0){ 
       while($row = $stmt->fetch_assoc()){ 
        $query = "SELECT * FROM comments WHERE postId=".$row['id']; 
        $comNumber = $conn->query($query); 
        $total = $comNumber->num_rows; 


        echo "<section class='post'> 
           <img class='postImage' src='img/".$row['id'].".png'> 
           <div class='postComment'> 
            <div class='postCommentBubble'><img src='img/commentBubble.svg'></div> 
            <div class='postCommentCount'>".$total." comments</div>"; 

        echo "<div class='postDate'>".date("d F Y G:i", strtotime($row["date"]))."</div>"; 

         if(isset($_SESSION['user']) && $_SESSION['privileges']==true){ 
          echo "<a class='postDelete' href='delete-post.php?id=".$row["id"]."'><img src='img/garbage.svg'></a>"; 
          echo "<a class='postEdit' href='edit-post.php?id=".$row["id"]."'><img src='img/pencil.svg'></a>"; 
         } 

         echo "</div> 
           <header class='postTitle'><a href='post.php?id=".$row['id']."'>".$row['title']."</a></header> 
           <div class='postIntro'>".$row['intro']."</div> 
           <div class='postLinkContainer'><a class='postLink' href='post.php?id=".$row['id']."'>read more</a></div> 
          </section> 
          "; 
       } 
      } 

答えて

1

がここに読みました:http://php.net/manual/en/mysqli.prepare.phpそれが失敗した場合にはfalseを取得する準備。したがって、あなたのエラー。

問題は、SQLのために、変数名の代わりに?を使用する必要があり、prepareはデータのバインドを期待しています。私はあなたが欲しいと思う:

$sql = "SELECT * FROM posts WHERE date >= ? AND date <= ? ORDER BY date DESC"; 
$stmt->bind_param('ii', $from, $to); 
+0

それが間違っていて、それはエラーを取り除きましたが、それでも何らかの理由で結果が得られません。最初の投稿をより多くのコードで更新しました。あなたがそれを見ることができるなら、私はそれを感謝します。ありがとう。 – hinvest

+0

@hinvest申し訳ありませんが、どの出力が得られているのか、コードに基づいて期待していたものがわかりません。あなたはクエリを実行し、期待している結果を得ることができますか?しかしこれは問題を拡張しています。時間をかけてSQLとPHPを見て、後で別の質問をすることをお勧めします。 – nerdlyist

+0

私の問題は、結果が得られないということです。クエリの「日付」要件と一致するデータベース内の行があっても、MySQLは行を返しません。 – hinvest

0

あなたの更新されたステータスに関して、fetch_assoc()はmysqli文オブジェクトのメンバーではありません。しかし、fetch()はあなたが探しているメンバ関数です。

また、bind_result()を使用してデータにアクセスすることもできます。

ので例は次のようになります。ここでは

$timestamp = time(); 

    //create select statement 
    $stmt = $con->prepare("SELECT column_x, column_y, column_z FROM table_name WHERE date < ?"); 

    //bind $timestamp to the prepared statement 
    $stmt->bind_param("i", $timestamp); 
    $stmt->execute(); 

    //bind each selected column to a variable for iteration 
    $stmt->bind_result($column_x, $column_y, $column_z); 
    while($stmt->fetch()) 
    { 
     echo $x . " " . $y . " " . $z . "\n"; 
    } 

mysqli_stmt class

編集のための参照リンクである:私はまたmysli_stmtオブジェクトがNUM_ROWS性質を持っていながら、ということを指摘したいと思いますクエリ結果のnum_rowsプロパティと同じではありません。

+0

私の最後のコメントをご覧ください。あなたは正しいかもしれませんが(私は何も確認していません)、1つのスレッドに2つの質問に対する2つの答えがあります。これは、SOがどのように動作するはずではありません。 – nerdlyist

+0

@nerdlyistは気にしません。ただ誰かを助けようとした。 – SkrapsDX

関連する問題