Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
左连接,若第二个表的结果存在,则添加到PHP中的数组_Php_Mysql_Arrays_Left Join - Fatal编程技术网

左连接,若第二个表的结果存在,则添加到PHP中的数组

左连接,若第二个表的结果存在,则添加到PHP中的数组,php,mysql,arrays,left-join,Php,Mysql,Arrays,Left Join,我试图通过显示一些术语的定义(如果存在定义)来扩展我正在构建的词典的功能 我从以下两个表中获取数据: $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " . "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ". "WH

我试图通过显示一些术语的定义(如果存在定义)来扩展我正在构建的词典的功能

我从以下两个表中获取数据:

    $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " .
            "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ".
            "WHERE ".DICTIONARY_TABLE.".".$source." LIKE '%".$keyword."%' ".
            "AND ".DICTIONARY_TABLE.".theme_id = ".$selected_theme_id." ".
            "ORDER BY ".DICTIONARY_TABLE.".id");
    while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    // get theme name
    $theme_name = "theme_".$lang;
    $theme_query= $db->query("SELECT theme_id,".$theme_name." FROM ".DICTIONARY_THEMES." WHERE theme_id = ".$theme_id."");
    $theme_row  = $theme_query->fetch(PDO::FETCH_ASSOC);
    $theme      = $theme_row[$theme_name];

    // add all results to an array
    $results[] = array(
        'english'           => $row['english'],
        'bulgarian'         => $row['bulgarian'],
        'english_abbr'      => $row['english_abbr'],
        'bulgarian_abbr'    => $row['bulgarian_abbr'],
        'theme'             => $theme,
        'bulgarian_definition'  => $row['bulgarian_definition'],
        'english_definition'    => $row['english_definition']
    );  
}// end while
之后,在
while
循环中,我首先(从另一个表中)获取主题名称,然后将查询结果添加到数组中:

        while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    // get theme name
    $theme_name = "theme_".$lang;
    $theme_query= $db->query("SELECT theme_id,".$theme_name." FROM ".DICTIONARY_THEMES." WHERE theme_id = ".$theme_id."");
    $theme_row  = $theme_query->fetch(PDO::FETCH_ASSOC);
    $theme      = $theme_row[$theme_name];

    // add all results to an array
    $results[] = array(
        'english'           => $row['english'],
        'bulgarian'         => $row['bulgarian'],
        'english_abbr'      => $row['english_abbr'],
        'bulgarian_abbr'    => $row['bulgarian_abbr'],
        'theme'             => $theme
    );
之后,我尝试检查
左连接是否实际从定义表返回了任何结果,如果是,也将这些结果添加到数组中-但这就是我失败的地方

    // check if definition exists for this term
    if(isset($row['bulgarian_definition'])) {
        array_push($results['bulgarian_definition'], $row['bulgarian_definition']);
    }
    if(isset($row['english_definition'])) {
        array_push($results['english_definition'], $row['english_definition']);
    }
我已经尝试了各种方法,首先检查变量是否已定义,然后将它们推送到
$results
数组。什么都不管用

我似乎无法成功地找到
英语定义
和/或
保加利亚定义
已设置。当我在PhpMyAdmin中运行查询本身时,它工作得很好

我能想到的唯一“解决方案”是放弃为定义使用单独的表的想法,只扩展主表,但我知道这不是一个好方法。 任何关于我做错了什么的见解都将不胜感激。谢谢

编辑:我更改了将元素添加到数组的方式:

    // check if definition exists for this term
    if(isset($row['bulgarian_definition'])) {
        $results['bulgarian_definition'] = $row['bulgarian_definition'];
    }
    if(isset($row['english_definition'])) {
        $results['english_definition'] = $row['english_definition'];
    }
现在这就成功了。当我将
$results
数组转储到
while
循环之外时,两个定义都已添加

但是,我现在在…
和“english”和“bulgarian”中得到大量的
警告:非法字符串偏移量“theme”――当我在foreach循环中运行$results数组开始打印它们时,会发生这种情况:

    foreach($results as $result) {

    if($theme != $result['theme']) {
        $theme = $result['theme'];
        $search_results .= "<h3>" . $result['theme'] . "</h3>";
    }

    if($source == "english") {
        foreach ($keywords as $keyword) {
            $result['english'] = preg_replace("|($keyword)|Ui", "<span style=\"color:#780223\">" . $keyword . "</span>", $result['english']);
        }
这个现在很好用。当我转储数组时,如果不存在定义,我就有
'english\u definition'=>null
,如果存在定义,它就在那里。到目前为止还不错

新的问题是,我不能再按主题对结果进行分组-显示最后找到的结果的主题。这是一个完全不同的问题。真正让我恼火的是,在我添加定义之前,一切都很顺利。你可以访问工作网站

问题解决了

  • 决定不将值推送到数组(如上所示)
  • 摆脱了
    while
    循环中获取主题名称的额外查询,将其移动到执行搜索的查询。因此,查询本身是:

                    $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " .
            "JOIN ".DICTIONARY_THEMES." ON ".DICTIONARY_TABLE.".theme_id = ".DICTIONARY_THEMES.".theme_id ".
            "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ".
            "WHERE ".DICTIONARY_TABLE.".".$source." LIKE '%".$keyword."%' ".
            "ORDER BY ".DICTIONARY_TABLE.".theme_id, ".DICTIONARY_TABLE.".id");
    
  • while
    循环是:

        while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    
        $theme_name = "theme_".$lang;
    
        // add all results to an array
        $results[] = array(
            'english'           => $row['english'],
            'bulgarian'         => $row['bulgarian'],
            'english_abbr'      => $row['english_abbr'],
            'bulgarian_abbr'    => $row['bulgarian_abbr'],
            'theme'             => $row[$theme_name],
            'bulgarian_definition'  => $row['bulgarian_definition'],
            'english_definition'    => $row['english_definition']
        );  
    }// end while
    
    上面的网站链接现在将加载升级的搜索功能,其中将显示定义(如果存在)。对任何好奇的人来说,“蠕虫”就是一个例子

    事实证明,有时候解决问题所需要的只是向人们展示它,然后开始思考它,因为有时候解决方案就在你面前。感谢所有参与的人

    编辑:删除了以前的答案,因为它不正确。一旦我找到问题的解决方案,我将更新此答案。我没有删除这个答案,因为我还没有找到这样做的选项。虽然有时候占据空间并感觉自己很重要很有趣:),但不要恨玩家,要恨游戏



    查看对
    $theme\u query
    的查询,它是
    选择主题id,“.$theme\u name.”FROM…
    。因此,这些列不在
    $theme\u行
    中,而是在
    $row
    中,这是外部循环变量。@Sean您是对的。我对他的问题进行了评论,以显示他在$row数组中填充的代码,我现在将根据新信息编辑我的答案。在第二部分-
    $results[]=array(
    是正确的,如果您在
    while($row=$query->fetch(PDO::fetch\u ASSOC))的每个循环中添加数组{
    。如果返回的行数超过1行,则必须是
    $result[]
    ,就像
    $result
    一样,只有在每次循环迭代中,才会覆盖上一个值,并且只覆盖最后一个循环值将被保存。@Sean因此,如果我有一个名为
    $result
    的数组,其中已经有信息,并且我想向其中添加行,那么我可以使用
    $result[]=array(…)
    ,这将得到与
    数组推送($result,array(…)
    相同的结果?是的。我更喜欢
    $result[]
    而不是
    数组推送()
    ,但它们基本上做了相同的事情-请向我们展示您在$row数组中填充的代码您是否执行了
    打印($results)
    以查看
    数组推送()
    工作,但只是将它们作为新数组元素添加,而不是将它们添加到循环中创建的
    $result[]
    中。是的,我执行
    打印\r($results)
    但是
    array\u push
    没有添加新元素,因为
    english\u definition
    bulgarian\u definition
    都是空的,我想,
    $results[]=$row['english\u definition']