PHP MySqli 显示相似术语(关键字)的结果
PHP MySqli show result for similar terms (Keyword)
让我快速解释一下我想做什么!
我想通过 PHP 术语显示我数据库中的类似行。
我有一个名为“游戏”的 table 和一个名为“标题”的列,标题看起来像“Rockstar - GTA V”。
所以我想删除破折号后的所有单词并使用新字符串作为关键字在数据库中搜索。
我的 CMS 使用此代码在循环内显示 post 标题:
$_smarty_tpl->tpl_vars['game']->value['title']
我刚刚找到了将“Rockstar - GTA V”转换为“Rockstar”的代码:
<?php $mygame = strstr($_smarty_tpl->tpl_vars['game']->value['title'], '-', true); echo($mygame); ?>
当我将此代码放入我的“单一模板文件”时,它工作正常并且 trim 我想要的标题并且它在每个游戏的单个页面中工作良好。
所以我想在单个页面中制作一个部分来显示该公司制作的所有游戏(我的意思是 trim 标题中的 med 词)。我尝试了一些代码,但什么也没有!这是我试过的:
<?php
$connect = mysqli_connect("localhost", "dbname", "dbpass", "dbuser");
$connect->set_charset('utf8mb4');
mysqli_set_charset($link, 'utf8mb4');
$gamecompany = strstr($_smarty_tpl->tpl_vars['game']->value['title'], '-', true);
$query = 'SELECT * FROM games WHERE title = "'.$gamecompany.'" ORDER BY game_id ASC LIMIT 50';
$result = mysqli_query($connect, $query);
if(mysqli_num_rows($result) > 0)
{
$output .= '<div class="list">';
while($row = mysqli_fetch_array($result))
{
$output .= '<li class="game"><a href="https://example.com/'.$row["game_id"].'/" target="_blank">'.$row["title"].'</a></li>';
}
$output .= '</div>';
echo $output;
}
else
{
echo 'Nothing Found';
}
?>
所以我使用 $gamecompany
到 trim 并获取游戏公司并将其用作查询中的关键字。但每次它只显示“Nothing Found”。当我的数据库中有一些带有关键字“Rockstar”的游戏时,但它不会显示,只是通过条件语句,什么也不能显示。
尝试了其他关键字(直接在我的代码中)但不起作用!
还有一个注意事项:我的标题是“阿拉伯语”语言,应该是UTF8.这是我的问题吗?或者只是编码错误?
尝试在查询中使用 LIKE 关键字,对于阿拉伯语部分,确保网络应用程序和数据库使用相同的编码,我曾经遇到过这个问题,当它们都遵循相同的编码时,它就解决了.
满足您的要求
title = "'.$gamecompany.'"
行不通。您需要使用 likewise 搜索或全文搜索
同样
title like '$gamecompany'
全文 - 要使全文正常工作,您需要为该列创建全文索引
MATCH (title) AGAINST (:gamecompany IN NATURAL LANGUAGE MODE)
您可以像这样创建全文索引
ALTER TABLE games ADD FULLTEXT(title)
使用 LIKE 可以找到所有出现 'Rockstar' 的地方,但为了安全起见,将其转换为小写并删除可能出现的任何额外空格。此外,让我们使用准备好的语句来保护自己免受 SQL 攻击。
$gamecompany = strtolower(trim(strstr($_smarty_tpl->tpl_vars['game']->value['title'], '-', true))); // put it in lower case, trim any excess white space
$query = 'SELECT * FROM games WHERE LOWER(title) LIKE ? ORDER BY game_id ASC LIMIT 50';
$stmt = $conn->prepare($query);
$value = "%$gamecompany%"; // The % allows us to find any titles that have our search string in them
$stmt->bind_param("s", $value);
$stmt->execute();
$result = $stmt->get_result();
让我快速解释一下我想做什么! 我想通过 PHP 术语显示我数据库中的类似行。 我有一个名为“游戏”的 table 和一个名为“标题”的列,标题看起来像“Rockstar - GTA V”。 所以我想删除破折号后的所有单词并使用新字符串作为关键字在数据库中搜索。
我的 CMS 使用此代码在循环内显示 post 标题:
$_smarty_tpl->tpl_vars['game']->value['title']
我刚刚找到了将“Rockstar - GTA V”转换为“Rockstar”的代码:
<?php $mygame = strstr($_smarty_tpl->tpl_vars['game']->value['title'], '-', true); echo($mygame); ?>
当我将此代码放入我的“单一模板文件”时,它工作正常并且 trim 我想要的标题并且它在每个游戏的单个页面中工作良好。
所以我想在单个页面中制作一个部分来显示该公司制作的所有游戏(我的意思是 trim 标题中的 med 词)。我尝试了一些代码,但什么也没有!这是我试过的:
<?php
$connect = mysqli_connect("localhost", "dbname", "dbpass", "dbuser");
$connect->set_charset('utf8mb4');
mysqli_set_charset($link, 'utf8mb4');
$gamecompany = strstr($_smarty_tpl->tpl_vars['game']->value['title'], '-', true);
$query = 'SELECT * FROM games WHERE title = "'.$gamecompany.'" ORDER BY game_id ASC LIMIT 50';
$result = mysqli_query($connect, $query);
if(mysqli_num_rows($result) > 0)
{
$output .= '<div class="list">';
while($row = mysqli_fetch_array($result))
{
$output .= '<li class="game"><a href="https://example.com/'.$row["game_id"].'/" target="_blank">'.$row["title"].'</a></li>';
}
$output .= '</div>';
echo $output;
}
else
{
echo 'Nothing Found';
}
?>
所以我使用 $gamecompany
到 trim 并获取游戏公司并将其用作查询中的关键字。但每次它只显示“Nothing Found”。当我的数据库中有一些带有关键字“Rockstar”的游戏时,但它不会显示,只是通过条件语句,什么也不能显示。
尝试了其他关键字(直接在我的代码中)但不起作用!
还有一个注意事项:我的标题是“阿拉伯语”语言,应该是UTF8.这是我的问题吗?或者只是编码错误?
尝试在查询中使用 LIKE 关键字,对于阿拉伯语部分,确保网络应用程序和数据库使用相同的编码,我曾经遇到过这个问题,当它们都遵循相同的编码时,它就解决了.
满足您的要求
title = "'.$gamecompany.'"
行不通。您需要使用 likewise 搜索或全文搜索
同样
title like '$gamecompany'
全文 - 要使全文正常工作,您需要为该列创建全文索引
MATCH (title) AGAINST (:gamecompany IN NATURAL LANGUAGE MODE)
您可以像这样创建全文索引
ALTER TABLE games ADD FULLTEXT(title)
使用 LIKE 可以找到所有出现 'Rockstar' 的地方,但为了安全起见,将其转换为小写并删除可能出现的任何额外空格。此外,让我们使用准备好的语句来保护自己免受 SQL 攻击。
$gamecompany = strtolower(trim(strstr($_smarty_tpl->tpl_vars['game']->value['title'], '-', true))); // put it in lower case, trim any excess white space
$query = 'SELECT * FROM games WHERE LOWER(title) LIKE ? ORDER BY game_id ASC LIMIT 50';
$stmt = $conn->prepare($query);
$value = "%$gamecompany%"; // The % allows us to find any titles that have our search string in them
$stmt->bind_param("s", $value);
$stmt->execute();
$result = $stmt->get_result();