2015-11-03 11 views
1

Im действительно пытается получить значения для комментирования системы со следующим SQL:как исправить сообщение об ошибке нарушения кардинальное в PHP & MySQL

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

, но следующее сообщение об ошибке:

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

Так что должно я делаю, чтобы исправить эту ошибку и как отображать комментарии к соответствующим сообщениям? [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; 

    } 

    } 
+0

При задании вопросов о PHP/SQL вы должны пометить механизм SQL db (MySQL, SQL Server или что-то еще). Вы также должны включить схему своей базы данных. И [тег: комментарии] здесь не применим, потому что тег wiki утверждает, что это о комментариях в коде, например '// comments like this' или'/* комментарии вроде этого */', поэтому я удалил его. Я добавил тег 'mysql', потому что я предполагаю, что это то, что вы используете, но если это неправильно, измените его. – Jakar

+0

И последняя строка вашей ошибки выделена полужирным шрифтом из-за '#' в начале строки, поэтому я изменил ее на '\ #'. – Jakar

+0

спасибо @Jakar, вы можете также просветить меня о том, как включить схему БД. как, я новичок в задании вопросов на форумах – shan2batman

ответ

1

При использовании 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... 

Потому что, как вы иметь одинаковое число столбцов на обоих выбирает.

Кроме того, лучше использовать LIKE, чем = при сравнении с колонкой char/varchar.

+0

спасибо за указание на разницу @Jakar теперь я столкнулся с новой проблемой после изучения других ресурсов в Интернете, я сделал соединение, и результаты приходят, но проблема в том, для печати всех сообщений. а не к сообщениям, где они должны быть прикреплены. Кажется, я прикрутил петлю, смогу ли ты указать правильную петлю для меня. ??? – shan2batman

+0

@ shan2batman. Возможно, вам будет лучше задавать новый вопрос, поскольку первая проблема (ошибка нарушения мощности) была решена, а проблема JOIN - это новая отдельная проблема ... Но каково содержимое '$ status2View '? – Jakar

+0

Насколько это разумно, вы должны отправить все свои запросы сразу. Выполнение запросов в 'foreach' - отличный способ получить ужасную производительность ... I.e. Обычно вы можете получать нужные значения из 'foreach', а затем запускать один запрос, который получает все ваши результаты. – Jakar

Смежные вопросы