【问题标题】:PHP prepared statement breaks using Inner JoinPHP 准备好的语句使用内连接中断
【发布时间】:2015-06-26 17:11:13
【问题描述】:

这是 MySQLi 扩展。我有两张桌子,sources 和 source_categories。在sources 中有一个存储源类别ID 的列,它被称为source_category_id 作为外键。在source_categories 表中,source_category_id 是主键,source_category_name 保存实际的类别名称。很基本。

我想INNER JOINsource_category_id 上的两个表。我之前成功地与INNER JOIN 合作过。但是,当我去测试页面时,我收到了Fatal error: Call to a member function bind_param() on a non-object。

准备好的语句只有一个占位符,如下所示,它来自一个包含查询字符串值的变量。

这不起作用:

$sql = 'SELECT source_category_id, source_by, source_name, source_contact, source_category_name
    FROM sources INNER JOIN source_categories
    ON sources.source_category_id = source_categories.source_category_id
    WHERE source_type = ?
    ORDER BY source_name ASC';
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $ps);    
$stmt->bind_result($source_category_id, $source_by, $source_name, $source_contact, $source_category_name);  
$stmt->execute();
$stmt->store_result();
$numRows = $stmt->num_rows;

但是,在它们各自的位置省略INNER JOIN 代码以及source_category_name 和$source_category_name,如下所示:

$sql = 'SELECT source_category_id, source_by, source_name, source_contact
    FROM sources
    WHERE source_type = ?
    ORDER BY source_name ASC';
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $ps);    
$stmt->bind_result($source_category_id, $source_by, $source_name, $source_contact); 
$stmt->execute();
$stmt->store_result();
$numRows = $stmt->num_rows;

工作得很好,但我也想要类别名称。

我显然错过了一些非常愚蠢的东西,或者我在某处违反了语法,但我疲惫的眼睛和受伤的大脑找不到问题。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您可以从here得到答案
  • SO上的解决方案太多了
  • @ShaunakShukla 我已经在 SO 和互联网上倾注了好几个小时,直到有必要才想发帖。有趣的是,我读了你链接到的那篇文章。它没有帮助。此外,这不是您提到的问题的重复。我想知道为什么我的查询失败,而不是错误的含义。不过谢谢!
  • SELECT sources.source_category_id 因为否则source_category_id 是模棱两可的。

标签: php join mysqli inner-join


【解决方案1】:

@Jack 击中了它的头部,非常感谢您的帮助。这是有效的查询:

$sql = 'SELECT sources.source_category_id, sources.source_by, sources.source_name, sources.source_contact, source_categories.source_category_name
    FROM sources INNER JOIN source_categories
    ON sources.source_category_id = source_categories.source_category_id
    WHERE sources.source_type = ?
    ORDER BY sources.source_name ASC';
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('s', $ps);    
$stmt->bind_result($source_category_id, $source_by, $source_name, $source_contact, $source_category_name);  
$stmt->execute();
$stmt->store_result();
$numRows = $stmt->num_rows;

再次,非常感谢!

【讨论】:

    【解决方案2】:

    改变

    $sql = 'SELECT source_category_id, source_by, source_name, source_contact, source_category_name
        FROM sources INNER JOIN source_categories
        ON sources.source_category_id = source_categories.source_category_id
        WHERE source_type = ?
        ORDER BY source_name ASC';
    

    到

    $sql = 'SELECT source_category_id, source_by, source_name, source_contact, source_category_name
        FROM sources INNER JOIN source_categories
        ON sources.source_category_id = source_categories.source_category_id
        WHERE sources.source_type = ?
        ORDER BY sources.source_name ASC';
    

    【讨论】:

    • 我试过了,还是一样的错误,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2016-07-22
    • 2023-03-08
    相关资源
    最近更新 更多