Probleme cautare in baza de date cu PDO

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
cadou
Mesaje: 328

Probleme cautare in baza de date cu PDO

inainte de a utiliza PDO acest cod mergea perfect, acum daca scriu un nume valid intreg nu il afiseaza. daca scriu doar primele 2 litere din el, afiseaza.

Cod: Selectaţi tot

<?php include('conectare.php');
if($_POST) 
{
$name = $_POST['searchword'];
$searchname = strtolower($name);

$searchresult="SELECT * from `membri` WHERE `nume` like '%$searchname%' ORDER BY RAND() LIMIT 8";
$searchnumberresult = $dbh->query($searchresult);
$xxxxxx = $searchnumberresult->fetch(PDO::FETCH_NUM);
if($xxxxxx != true)
{ ?>

<div class="display_box" align="left" style="color:red;">
     <center>
         Fara rezultate. <br>
         <b>Sfat: Scrie numele de utilizator sau orasul corect!</b>
     </center>
</div>

<?php }

else if($xxxxxx > 0){ 
while($search = $searchnumberresult->fetch(PDO::FETCH_ASSOC))
{
$nume=$search['nume'];
$b_nume='<b>'.$searchname.'</b>';
$final_nume = str_ireplace($searchname, $b_nume, $nume);
?> 

<style type="text/css">
<!--
a.rezcautare {text-decoration:none;}
-->
</style>

<a class="rezcautare" href="/<?php echo $search['nume']; ?>.php">
<div class="display_box" align="left">

    <img src="/users/poza-profil/<?php echo $search['id']; ?>.jpg" style="width:50px; height:50px; float:left; margin-right:6px;" /><span class="name"><?php echo $final_nume; ?></span>&nbsp;<br/><?php echo $search['oras']; ?><br/>

</div>
</a>
<?php } } } ?>
Exemplu:
Daca scriu ad -> afiseaza tot ce gaseste cu ad
Daca scriu Adr -> nu mai afiseaza nimic, desi exista ceva in baza de date
Daca scriu tot cuvantul Adrian -> nu mai afiseaza nimic, desi exista ceva in baza de date

MarPlo Mesaje: 4343
Salut
Nu stiu de ce pt 2 litere functioneaza, dar pentru mai mult nu. Oricum, e gresita verificarea "$xxxxxx > 0" unde $xxxxxx e rezultatul dat de fetch(PDO::FETCH_NUM). Aceasta functie returneaza un array, sau false.
Mai bine verifici daca sunt coloane in rezultat, cu columnCount().
Verificarea ar trebui asa:

Cod: Selectaţi tot

$xxxxxx = $searchnumberresult->columnCount();
if($xxxxxx == 0) {
  // no results
}
else {
  // parcurge rezultatul
  while($search = $searchnumberresult->fetch(PDO::FETCH_ASSOC)) {
    // preia datele din fiecare rand
  }
}
 
Sau poti incerca sa adaptezi acest model:

Cod: Selectaţi tot

$nores = '<div class="display_box" align="left" style="color:red;"><center>
  Fara rezultate. <br>
  <b>Sfat: Scrie numele de utilizator sau orasul corect!</b>
</center></div>';

$sql="SELECT * from `membri` WHERE `nume` like '%". addslashes($searchname) ."%' ORDER BY RAND() LIMIT 8";
$sqlre = $dbh->query($sql);
if($sqlre !== false) {
  // daca sunt coloane rezultate
  if($sqlre->columnCount() > 0) {
    // Se parcurg datele si le afiseaza
    while($row = $sqlre->fetch(PDO::FETCH_ASSOC)) {
      $nume = $row['nume'];
      $b_nume='<b>'.$searchname.'</b>';
      $final_nume = str_ireplace($searchname, $b_nume, $nume);
      // ... Restul codului
    }
  }
  else echo $nores;
}
else echo $nores;
 

cadou Mesaje: 328
Pffff tot nu merge :(
la rezultate imi apar, dar cand nu am rezultate nu apare mesajul acela ca nu sau gasit rezultate

Cod: Selectaţi tot

<?php include('conectare.php');
if($_POST) 
{
$name = $_POST['searchword'];
$searchname = strtolower($name);

$searchnumberresult = $dbh->query("SELECT * from `membri` WHERE `nume` like '%$searchname%' ORDER BY RAND() LIMIT 8");
$xxxxxx = $searchnumberresult->columnCount();
if($xxxxxx > 0)
{
while($search = $searchnumberresult->fetch(PDO::FETCH_ASSOC))
{
$nume=ucwords($search['nume']);
$b_nume='<b>'.ucwords($searchname).'</b>';
$final_nume = str_ireplace($searchname, $b_nume, $nume);
?>
<style type="text/css">
<!--
a.rezcautare {text-decoration:none;}
-->
</style>

<a class="rezcautare" href="/<?php echo $search['nume']; ?>.php">
<div class="display_box" align="left">
	<img src="/users/poza-profil/<?php echo $search['id']; ?>.jpg" style="width:50px; height:50px; float:left; margin-right:6px;" />
		<span class="name"><?php echo "$final_nume<br> Stare: $search[stare], Interes: $search[interes]"; ?></span>
		&nbsp;<br/>
		<?php echo "$search[oras] - $search[tara]"; ?><br/>
</div>
</a>
<?php } }

else {
?> 
<div class="display_box" align="left" style="color:red;">
	 <center>
		 Fara rezultate. <br>
		 <b>Sfat: Scrie numele de utilizator sau orasul corect!</b>
	 </center>
</div>
<?php } } ?>

MarPlo Mesaje: 4343
Nu stiu, verifica ce valoare are $xxxxxx, cu:

Cod: Selectaţi tot

var_dump($xxxxxx);
 

cadou Mesaje: 328
Imi afiseaza mereu int(28) indiferent daca am rezultate sau nu

P.S Am rezolvat-o , cred, am mai adaugat ceva

Cod: Selectaţi tot

$name = $_POST['searchword'];
$searchname = strtolower($name);

$searchnumberresult = $dbh->query("SELECT * from `membri` WHERE `nume` like '%$searchname%' ORDER BY RAND() LIMIT 8");

$r = $dbh->query("SELECT COUNT(*) FROM `membri` WHERE `nume` like '%$searchname%' ORDER BY RAND() LIMIT 8")->fetch(PDO::FETCH_NUM);
$numrows = $r[0];

if($numrows > 0) 
{
// afiseaza rezultatele
}
else
{
// mesajul de eroare
}
 

Subiecte similare