2013-04-17 3 views
1

Может кто-нибудь объяснить мне, когда я повторяю переменную $ rows_affected, почему я получаю только 1, когда мне нужно получить 2 на основе записей db? Больше, чем полчаса, пытаясь разобраться в этом и все еще не могу решить его. По-прежнему noob на PDO.Php PDO неверный подсчет строк

Любые другие советы приветствуются.

$sql1 = "SELECT title FROM page WHERE id=?"; 
     $stm = $db->prepare($sql1); 
     $stm->execute(array($id)); 
     $row1 = $stm->fetch(PDO::FETCH_ASSOC); 

     $sql2 = "SELECT id,title,pg_title FROM page WHERE title=? ORDER BY id ASC"; 
     $stm = $db->prepare($sql2); 
     $stm->execute(array($row1['title'])); 

     $rows_affected = $stm->fetchColumn(); 

     if (count($rows_affected) > 0) { 
      for($i=0; $i <= $rows_affected; $i++) { 

       $row2 = $stm->fetch(PDO::FETCH_ASSOC); 

       if($row2['id']==$id){ 
        echo '<a href="javascript: void(0)"><b>'.$row2['pg_title'].'</b></a>&nbsp;&nbsp;'; 
       }else{ 
        echo '<a href="page.php?id='.$row2['id'].'';?><?php if(isset($_GET['edit']) && $_GET['edit']==1){ echo '&edit=1';}?><?php echo'">'.$row2['pg_title'].'</a>&nbsp;&nbsp;'; 

       } 
      } 
     } 
+3

Это 'fetchColumn()' получит значение столбца 'id' из первого результата второго запроса, это не имеет никакого отношения к количеству найденных записей. Вы имели в виду сделать 'rowCount()'? Обратите внимание, что подход 'rowCount()' будет работать только с MySQL. Также обратите внимание, что '$ rows_affected' будет скалярным значением в любом случае, и поэтому' count() 'не имеет никакого смысла в связи с ним. – DaveRandom

+0

Спасибо, что сработало сперва! Глупая ошибка. Когда вы говорите, что rowCount() будет работать только с mysql, вы имеете в виду, что он работает только в том случае, если im кодирование в mysql? Ps: Мой английский не очень жаль – miguelfsf

+1

@miguelfsf Звучит нормально для меня :) –

ответ

0

fetchColumn():

Возвращает один столбец из следующего ряда из результирующего набора или FALSE, если нет больше строк.

Я думаю, вы хотите использовать fetchAll(). Используйте PDO::FETCH_COLUMN как $fetch_style, если вы хотите только первую колонку. Например.

$rows_affected = $stm->fetchAll(PDO::FETCH_COLUMN, 0); 
0

Если вы используете MySql, вы можете использовать метод rowCount.

Или лучше итерация непосредственно:

$stm->execute(array($row1['title'])); 
$stm->setFetchMode(\PDO::FETCH_ASSOC); 
foreach ($stm as $row2) { 
    if($row2['id']==$id){ 
     // do your stuff 
    } 
} 
0

Некоторые базы данных может возвращать количество строк, возвращаемых ЗЕЬЕСТ. Однако это поведение не гарантируется для всех баз данных и на него нельзя полагаться. Manual Вы можете использовать COUNT(*) и fetchColumn(), как в следующем запросе для эмулирования rowCount().

$sql2 = "SELECT COUNT(*) FROM page WHERE title=?"; 
    $stm = $db->prepare($sql2); 
    $stm->execute(array($row1['title'])); 

// Check the number of rows that match the SELECT statement 
if($sql2->fetchColumn() == 0) { 
    echo "No records found";//For Testing 
}else{ 
    $sql3 = "SELECT id,title,pg_title FROM page WHERE title=? ORDER BY id ASC"; 
    //Etc 
} 
Смежные вопросы