左连接,若第二个表的结果存在,则添加到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']
。