有人请问为什么以下准备好的声明什么都不返回?

时间:2010-04-30 23:15:42

标签: php mysqli prepared-statement

$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

没有准备好的陈述,没关系

2 个答案:

答案 0 :(得分:1)

你的mysql_real_escape_string()参数倒退了。它是($string_to_escape, $optional_database_handle)。因此,您尝试查询WHERE ads_in_Cat='Resource #1'而不是$ _GET参数。

答案 1 :(得分:1)

可能不是它返回0的原因,但你是双重转义$fromSCat - 你在预准备语句中不需要escape_string,bind_param已经这样做了。尝试注释掉escape_string&看看会发生什么。

此外,您可能希望在if语句中搜索bind / exec / fetch调用,除非在脚本中先前定义了$fromSCat


后续评论:该错误意味着您的数据库是粗略的。你有主键吗?相关表上的索引? mysqli对它抛出异常有点奇怪,这不是它的任何业务。如果您无权修复数据库表,请在脚本顶部附近添加mysqli_report(MYSQLI_REPORT_OFF);

(另外,如果你可以:改为使用PDO。在语法和文档方面都更好,更清晰。)