Aşağıdaki hazırlanan statment hiçbir şey döndürür neden kimse görebilirsiniz lütfen?

2 Cevap php
$stmt = mysqli_prepare($link,"
    SELECT *
      FROM ads
     INNER JOIN dept ON dept.id_dept = ads.in_dpt
     INNER JOIN members ON members.idMem = ads.from_Mem
     INNER JOIN sub_cat_ad ON id_sub_cat = ads.ads_in_Cat
     INNER JOIN cat_ad ON idCat_ad = sub_cat_ad.from_cat_ad
     WHERE ads_in_Cat = ? ");

if(isset($_GET['fromSCat'])){
    $fromSCat = mysqli_real_escape_string($link,$_GET['fromSCat']);
}

mysqli_stmt_bind_param($stmt,'i',$fromSCat);
mysqli_stmt_execute($stmt);
mysqli_stmt_fetch($stmt);

$tot=mysqli_stmt_num_rows($stmt); //Ouput: 0

Without the prepared statement, it's ok

2 Cevap

Muhtemelen 0 dönen, ama çift kaçan $fromSCat konum nedeni değil - Eğer hazırlanan tablolarda escape_string gerekmez, bind_param zaten yapar. Escape_string ve dışında yorum deneyin bakalım ne olacak.

Ayrıca, $fromSCat önceki komut tanımlanan sürece, sizin if deyimi içinde çağrıları almak / bind / exec kaçmak isteyebilirsiniz.


Followup re comment: bu hata veritabanı kabataslak demektir. Eğer birincil anahtarları & var mı ilgili tablolar üzerinde indeksler? mysqli o bir iş herhangi bir değil, bunun üzerinde bir istisna atmak için biraz garip. Eğer, DB tabloları düzeltmek yazısının üstüne yakın mysqli_report(MYSQLI_REPORT_OFF); eklemek için erişiminiz yoksa.

(Eğer olabilir de,:. Yerine PDO kullanabilirsiniz Bu sözdizimi ve belgelerinde hem de daha iyi ve temiz.)

Sen mysql_real_escape_string() parameters backwards. it's ($string_to_escape, $optional_database_handle) var. Yani WHERE ads_in_Cat='Resource #1' yerine $ _GET parametresi gibi bir şey sorgulamak için çalışıyoruz.