6

私はウェブプログラミングの初心者なので、何か間違ったことを言ってしまったら申し訳ありません。アラビア語の mysql DB (この Web サイトのコーラン データベースhttp://qurandatabase.org/Database.aspx - mysql クエリ ファイル形式 - アラビア語 (オリジナル))を検索するための単純な php スクリプトを作成していますが、非常に単純な問題があります。これは、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 テキスト ボックスに次の文字列を入力します。

お気に入りに追加

しかし、私はこの文字列を取得しますが、出力にほとんど違いがないため、自分でテストする必要があります:

お気に入りに追加

select * from Quran where AyahText like '%مِنَ الْجِنَّةِ وَالنَّاسِ%'

select * from Quran where AyahText like '%مِنَ الْجِنَّةِ وَالنَّاسِ%'

select * from Quran where AyahText like '%مِنَ الْجِنَّةِ وَالنَّاسِ%' 1

検索が失敗する原因となります。

質問のためのこのコピー アンド ペーストが私の正しい出力を保持して正しく表示されるかどうかはわかりませんが、私のブラウザでは、私の出力に不要な ِ または َ があります。助けてくれてありがとう。

4

3 に答える 3

3

مِنَ الْجِنَّةِ وَالنَّاسِ と مِنَ الْجِنَّة وَالنََّاسِ の違いは、印刷できない文字が別の場所にあることです。使用している照合に応じて、これにより 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;
于 2012-12-04T15:24:07.670 に答える
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");
于 2012-12-04T15:16:36.863 に答える
0

urldecode() を実行する必要はありません。$_GETPHP は、起動シーケンスの一部としてデータを取り込むときに、既にそれを行っています。

コードを使用した 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 ライブラリは推奨されていないため、これを使用しないというコメントがここにたくさん寄せられます。

于 2012-12-04T14:40:57.707 に答える