簡體   English   中英

如何在php&mysql中糾正基數違反錯誤消息

[英]how to rectify cardinality violation error message in php&mysql

我實際上嘗試使用以下sql獲取評論系統的值:

$sql="select * from updates where account_name=:either and type IN ('a', 'c') "
      . "  union "
      . "select * from comment_update where os_id=:statusid and type='b'";

但是發生以下錯誤:

致命錯誤:消息為“ SQLSTATE [21000]”的未捕獲異常“ PDOException”:基數違反:1222在其中使用的SELECT語句具有不同的列數
/opt/lampp/htdocs/project-chg/example.php:21堆棧跟蹤:#0
/opt/lampp/htdocs/project-chg/example.php(21):PDOStatement-> execute()
在第21行的/opt/lampp/htdocs/project-chg/example.php中拋出#1 {main}

那么我該怎么做才能糾正此錯誤,以及如何在適當的帖子中顯示評論? [edit]:感謝指出差異@Jakar現在,我在研究網絡上的其他資源后遇到了一個新問題,我加入了連接,結果即將來臨,但是現在的問題是,所有帖子的結果似乎都在打印。 而不是張貼在應附加的位置。 好像我搞砸了循環,你能為我指出正確的循環嗎??? 這是代碼:

 <?php
      $status2view=$project->statusView($_SESSION['uname']);

    foreach($status2view as $row){
           //print_r($row);
           $status_id=$row['update_id'];
        //   SELECT * FROM Product,Color WHERE Product.Name = Color.Name 
        $sql="select update_id,update_body, time, title, author,type from updates where account_name=:either and type IN ('a', 'c') "
                  . "  union "
                  . "select comment_id, author,time,comment_body,os_id ,type from comment_update where os_id=:statusid and type='b'";
        $sql1="select comment_update.comment_id, comment_update.author,comment_update.time,comment_update.comment_body,comment_update.os_id ,comment_update.type from updates,comment_update where comment_update.os_id like updates.update_id ";
        $stmth=$conn->prepare($sql1);
      //  $stmth->bindparam(":either",$_SESSION['uname']);
        //$stmth->bindparam(":statusid",$status_id);
        $stmth->execute();
        $status_reply= $stmth->fetchAll(PDO::FETCH_ASSOC);

        ?>
    </div>    
    <div class="col-lg-8">
        <?php
     foreach ($status_reply as $row1) {


         $status_reply_id=$row1['comment_id'];

                $reply_author=$row1['author'];
                $reply_d=htmlentities($row1['comment_body']);
                $reply_data=  stripslashes($reply_d);
                $reply_osid=$row1['os_id'];

               $reply_date=$row1['time'];
               $reply_delete_button="";
               if ($reply_author==$_SESSION['uname'] || $account_name==$_SESSION['uname']) {
                   $reply_delete_button.="<li><span id='$status_reply_id' class='delete_reply_btn glyphicon glyphicon-remove'><a href='#' title='Delete this comment'>Remove X</a></span></li>";
               }




              $status_replies="<div  class='replyboxes pull-left reply_".$status_reply_id."'><b>Reply by:-<a href='search_results.php?u=".$reply_author."'>".$reply_author."</a>"
                      . "<span class='pull-right'>".$reply_date 
                       . "<b class='caret'>
                         <small><span class='btn-xs btn-danger dropdown-toggle pull-right' data-toggle='dropdown' aria-expanded='true' ><span class='glyphicon glyphicon-edit'></span>
                        <ul class='dropdown-menu'>".$reply_delete_button
                      . "<li><a href='#' class='hidden_text_area glyphicon glyphicon-pencil reply_".$status_reply_id."' title='Edit this comment' >Edit</a></li>"
                      . "<li><a href='report.php?u='".$reply_author."'>Report</a><li></ul>"
                      . "</span></span></small></b><br><legend>".  html_entity_decode($reply_data)."</legend><br></div>";


     }

    foreach($status2view as $row){
         $updateid=$row['update_id'];
                $account_name=$row['account_name'];
                $os_id=$row['os_id'];
                $author=$row['author'];
                $post_date=$row['time'];
                $title= stripslashes($row['title']);
                $data= stripslashes($row['update_body']);

                $statusdeletebutton='';
                //insert_status_ui script to get message.
                if ($author==$_SESSION['uname'] || $account_name==$_SESSION['uname']) {
                $statusdeletebutton='<li>'
                           . '<a href="#" type="'.$updateid.'" class="delete_4_session hidden_text_delete_'.$updateid.' glyphicon glyphicon-trash delete_reply_btn" title="Delete this status and its replies">Remove</a></li>';
                }
                $status_list= $statusui_edit.'<div attr="'.$updateid.'" type="'.$updateid.'" class="statusboxes status_'.$updateid.'  jumbotron">'
                        . '<h3 style="color:black; margin-bottom:5px; margin-top:5px;" class="pull-left">'
                        . '<div id="'.$updateid.'" class="title_s_2copy" value="'.html_entity_decode($title).'">'.html_entity_decode($title).'</div></h3>'
                        . '<span class="pull-right">'
                        . '<div class="dropdown">'
                        . '<button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown"  >'
                        . '<span class="glyphicon glyphicon-edit"></span></button>'
                        . '<ul class="dropdown-menu">'
                        . '<li><a href="#" attr="'.$updateid.'" type="'.$updateid.'" class="edit_4_session hidden_text_edit glyphicon glyphicon-pencil" title="Edit this status" >Edit</a></li>'.$statusdeletebutton.'</ul></div></span><br><hr>'
                        . '<legend><span class=" data_s_2copy" type="'.$updateid.'" >'
                        . html_entity_decode($data).'</span><br><br></legend><b style="text-align:right; color:black;"><small>Posted by:-  <a href="search_results.php?u='.$author.'">'.$author.   '</a>   '.$post_date.'</small></b>'
                        . '<br><p>'.$status_replies.'</p><br>';

                    $status_list.= '<textarea id="reply_textarea_'.$updateid.'"  class="status_reply_'.$updateid.' input-custom2" placeholder="comment\'s"></textarea>'
                            . '<button id="reply_btn_'.$updateid.'" attr="'.$updateid.'" type="b" class="btn btn-warning pull-right btn-sm reply_btn reply_'.$updateid.'">Reply</button></div>';



                echo $status_list;

    }

    }

當您使用UNION ,它會組合結果集,並且要這樣做,每個列的列數必須相同。 因此,您不應SELECT * ,而應SELECT col1,col2,col3或任何列名。 (無論如何,使用SELECT *不好的做法,因為它降低了代碼的可讀性,並使PHP與數據庫模式更緊密地耦合在一起)。

我不知道您的表結構是什么樣的,因此很難給出一個完美的答案,但是我建議運行兩個查詢:

$sql =
    "SELECT column_list... FROM updates 
         WHERE account_name LIKE :either AND type IN ('a','c');"
    ."SELECT column_list... FROM comment_update 
          WHERE os_id=:statusid AND type LIKE 'b';"

否則,如果您確實確實需要(或希望使用) UNION ,則類似於:

SELECT name,content,id FROM updates...
UNION
SELECT name,content,id FROM comment_update...

因為這樣,兩個選擇上的列數都相同。

另外,與char/varchar列進行比較時,最好使用LIKE不是=

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM