SQL where子句不起作用

I'm here again, with a problem. This is my code:

$sql = "SELECT * FROM paginas WHERE subpagina='0'"; 
$q = $con->prepare($sql);
$q->execute();
$q->setFetchMode(PDO::FETCH_ASSOC);
$row = $q->fetch();

if (count($row) != "0")
{
    echo '<ul>';
    while($row = $q->fetch())
    {
       echo '<li><a href="?page='. $row['ID'] . '">' . $row['pagina'] .'</a></li>';
    }
    echo '</ul>';   
}

The problem is, all the records in the database where subpagina = 0 will be echoed on the page. But, if I use another string like 3 in the database, and in this code, it doesn't work.

I have done some thing like var_dump $row, var_dump(erroinfo()), but it only returns FALSE.

I hope you can help me.

EDIT: here is my data structure:

CREATE TABLE IF NOT EXISTS `paginas` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `pagina_link` varchar(150) NOT NULL,
  `content` varchar(10000) NOT NULL,
  `pagina` varchar(100) NOT NULL,
  `reactie` varchar(1) NOT NULL,
  `subpagina` varchar(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=39 ;

EDIT2: here is the data

INSERT INTO `paginas` (`ID`, `pagina_link`, `content`, `pagina`, `reactie`, `subpagina`) VALUES
(32, '?pagina=Home', '<h1>Welkom!</h1><div>Dit is een demo van het cms combora! Je mag hier op uittesten. Je kan inloggen met als gebruikersnaam demo en paswoord demo. Gelieve deze pagina niet te verwijderen.</div><div><br></div> <a href="?pagina=Home&foto=2&l=j"><img width="250px" height="250px;" src="fotos/foto2.jpg"></a>', 'Home', '1', '0'),
(33, '?pagina=test1', '<br>dslmlmqdhfkqsjdf', 'test1', '1', '0'),
(34, '?pagina=test2', '<br>', 'test2', '0', '0'),
(35, '?pagina=Nice', 'fasdfdsfadsf<br>', 'Nice', '1', '0'),
(36, '?pagina=Foto viewer ', 'Deze pagina is een test van de zelfgemaakt foto viewer:<div><br></div>
<a href=\\"?foto=1&amp;l=j\\"><img width=\\"250px\\" height=\\"250px;\\" src=\\"1.jpg\\"></a>
<a href=\\"?foto=2&amp;l=j\\"><img width=\\"250px\\" height=\\"250px;\\" src=\\"2.jpg\\"></a>
<a href=\\"?foto=3&amp;l=j\\"><img width=\\"250px\\" height=\\"250px;\\" src=\\"3.jpg\\"></a><div><br></div>', 'Foto viewer ', '1', '0'),
(38, 'sdkjfqsdfj', 'sdjmkqjfdmlkqsfdlmkqjsdflkjdlmskfjqslmdkfj', 'test56', '1', '2
');

I'm not sure if you mention this?

You mentioned it is a string. Try

$sql = "SELECT * FROM paginas WHERE subpagina='0'"; 

Fiddled a limited set of your table. Added some data and the above SELECT simply works. So that's not the problem. Are you sure you have other strings than '0' in the subpagina field?

See this sqlfiddle

Another thing you can try is

There's no such thing as subagine = 3 in your data. Only 0 and 2 exist

$row = $q->fetchAll(); 
print_r($row);
/* print_r shows Array only */
/* loop the array and print the values */
foreach($row as $key => $value)
{
   echo $key + " " + $value + "
";
}

EDIT

See it only just now: you do a fetch() assing it to $row and check the count. Then you start the while loop wiht anohter fetch() which will get the NEXT row of the result. The first one is skipped always because of the first fetch()

use something like this:

$rows = $q->fetchAll(); 

echo '<ul>';
foreach($rows as $value)
{
   echo '<li><a href="?page='. $value['ID'] . '">' . $value['pagina'] .'</a></li>';
}
echo '</ul>'; 

if you not want the empty <ul> tags you should check if count($rows) > 0 before you echo/foreach/echo

I don't know why you are using strings to store what seem to be integers, but the problem you are having is that '2 ' !== 2.

If you want to find '2 ' you need to look for exactly that or use a LIKE condition.

In the data you posted, I see that subpagina is actually a VARCHAR field, not a numeric field, and it has a value of 2. You can fix this in multiple ways:

  • SELECT ... WHERE subpagina LIKE '2%' to match the string 2 followed by anything else
  • Fix the data and remove the extra
  • The best way, if the data is indeed numeric, make that an INTEGER instead of VARCHAR