我是网络编程的新手,所以如果我说错了,我会道歉。 我正在写一个简单的PHP脚本来搜索阿拉伯语mysql数据库(来自这个网站的{Quran数据库http://qurandatabase.org/Database.aspx - mysql查询文件格式 - 阿拉伯语(原文))但我有一个非常简单的问题,这是我收到的我的PHP脚本中的GET方法不是我输入搜索的内容,而是在搜索到的字符串中添加了一些不需要的阿拉伯字符。 我的代码和输出如下: 我的HTML代码是:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ar" xml:lang="ar">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<body>
<form action="p.php" method="get" accept-charset="UTF-8">
Word Search: <input type="text" name="word"/>
<input type="submit"/>
</form>
</body>
</html>
我的PHP代码是:
<?php
header('Content-type: text/html; charset=utf-8');
$DBServer="localhost";
$DBUser="root";
$DBPass="1";
$DB="Quran";
$DBTable="Quran";
//echo "Welcome".$_GET["fname"];
$Word=$_GET['word'];
echo $Word;
echo "<br />";
echo "<br />";
$con=mysql_connect($DBServer,$DBUser,$DBPass);
if(!$con)
{
die("DB Connection error: ".mysql_error());
}
mysql_select_db($DB,$con);
echo "<br />\n";
echo "<br />\n";
echo "<br />\n";
echo "<br />\n";
echo "select * from $DBTable where AyahText like '%".$Word."%'";
echo "<br />\n";
$select="select * from $DBTable where AyahText like '%ﻢِﻧَ ﺎﻠْﺠِﻧَّﺓِ ﻭَﺎﻠﻧَّﺎﺳِ%'";
echo $select;
echo "<br />\n";
echo "<br />\n";
$select="select * from $DBTable where AyahText like '%".urldecode($Word)."%'";
echo $select;
echo "<br />";
$result=mysql_query($select);
//$result=mysql_query("select * from $DBTable where VerseID=$Word");
$LastSura=1;
echo $LastSura;
echo "<br />";
while($row=mysql_fetch_array($result))
{
echo "salam";
echo $row['SuraID']."\t".$row['VerseID']."\t".$row['AyahText'];
echo "<br />";
if($row['SuraID']!=$LastSura)
{
echo "<br />";
echo "<br />";
}
$LastSura=$row['SuraID'];
}
mysql_close($con);
?>
然后在我的html文本框中输入此字符串:
منالجنةوالناس
但是我得到的这个字符串在输出方面几乎没有差异,你必须自己测试一下:
منالجنةوالناس
选择*来自古兰经,其中AyahText喜欢'%منالجنةوالناس%'
选择*来自古兰经,其中AyahText喜欢'%منالجنةوالناس%'
选择*来自古兰经,其中AyahText喜欢'%منالجنةوالناس%' 1
它导致我的搜索失败。
我不知道这个问题的复制和粘贴是否保持我的正确输出能够正确显示你的信息,但是在我的浏览器中以及在我的浏览器中我有不想要的或在我的输出中。 非常感谢您的帮助。
答案 0 :(得分:2)
منالجنةوالناس和منالجنةوالناس之间的区别在于,不可打印的角色位于不同的位置。根据您使用的排序规则,这会使MySQL中的字符串相同或不同,从而影响查询结果:
mysql> select 'مِنَ الْجِنَّةِ وَالنَّاسِ' = 'مِنَ الْجِنَّةِ وَالنَّاسِ' collate utf8_general_ci general;
+---------+
| general |
+---------+
| 0 |
+---------+
1 row in set (0.00 sec)
mysql> select 'مِنَ الْجِنَّةِ وَالنَّاسِ' = 'مِنَ الْجِنَّةِ وَالنَّاسِ' collate utf8_unicode_ci unicode;
+---------+
| unicode |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
更改为列定义的排序规则以获取所需的结果,例如:
alter MyTable modify MyColumn text collate utf8_general_ci;
答案 1 :(得分:0)
您不需要执行urldecode()。当PHP填充$_GET
作为其启动序列的一部分时,PHP已经为您完成了这项工作。
请注意,您的代码容易受到SQL注入攻击。一个正确的搜索顺序是:
$word = $_GET['word'];
$safeword = mysql_real_escape_string($word);
$sql = "SELECT ... WHERE AyahText LIKE '%$safeword%'";
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_assoc($rresult)) {
...
}
当然,你会在这里得到很多关于不使用mysql库的评论,因为它已被弃用。
答案 2 :(得分:0)
这是我用你的文字测试的示例代码,它打印了包含单词的suraNo / ayahNo / ayah。
<?php
header('Content-type: text/html; charset=utf-8');
$server="localhost";
$user="root";
$pass="root";
$database="quran";
$table="quran";
$word=$_GET['word'];
$connection=mysql_connect($server,$user,$pass);
if(!$connection)
{
die("DB Connection error: ".mysql_error());
}
mysql_select_db($database,$connection);
mysql_query("SET NAMES utf8"); //IMPORTANT
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ar" xml:lang="ar">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<body>
<form method="get" accept-charset="UTF-8">
Word Search: <input type="text" name="word"/>
<input type="submit"/>
</form>
<div>
<?php
if (!empty($word))
{
$i = 0;
$str = "SELECT * FROM $table WHERE AyahText LIKE '%$word%'";
$query = mysql_query($str);
while ($row = mysql_fetch_assoc($query))
{
$i++;
echo "<br/>$i: ($row[SuraID], $row[VerseID]): $row[AyahText]";
}
}
?>
</div>
</body>
</html>
选择数据库后必须调用此方法。当我删除这一行时,我无法获得任何结果。
mysql_query("SET NAMES utf8");