简体   繁体   中英

how to rectify cardinality violation error message in php&mysql

Im actually trying to get values for a commenting system with the following 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'";

but the following error occurs:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21000]: Cardinality violation: 1222 The used SELECT statements have a different number of columns' in
/opt/lampp/htdocs/project-chg/example.php:21 Stack trace: #0
/opt/lampp/htdocs/project-chg/example.php(21): PDOStatement->execute()
#1 {main} thrown in /opt/lampp/htdocs/project-chg/example.php on line 21

So what should i do to rectify this error and how to display the comments to appropriate posts? [edit]: thanks for pointing the difference @Jakar now i face a new problem after researching other resources on the web, i did a join and the results are coming but the problem now is the results seem to be printing for all posts. and not to posts where they should be attached. seems like i screwed up the loop can you point the right loop for me.??? here is the code:

 <?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;

    }

    }

When you use a UNION , it combines the result sets, and in order to do that, the number of columns on each has to be the same. Thus, you should not SELECT * , but SELECT col1,col2,col3 or whatever your column names are. (it's bad practice to use SELECT * anyway, because it lowers readability of code and more tightly couples your PHP to your database schema).

I don't know what your table structures are like, so it's awfully hard to give a perfect answer, but I'd suggest running two queries:

$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';"

Otherwise, if you do indeed need (or prefer) the UNION , then something like:

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

Because that way you have the same number of columns on both selects.

Also, it's better to use LIKE than = when comparing with a char/varchar column.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM