4

私はAndroidアプリを開発しています。ここで私のアプリでは、AsyncTask が文字列を PHP に送信します。PHP は作物名の配列を返します。

私のphpファイルは次のとおりです。

 <?php

ini_set('default_charset', 'utf-8');
header('Content-Type: text/html; charset=UTF-8');



mysql_connect("localhost","root","");
mysql_select_db("farm_o_pedia");

mysql_set_charset('utf8');
$result1 = mysql_query("SET NAMES utf8");

$lang=$_POST['LanguageName'];

$query1="select lang_id from lang_selection where lang_name='$lang'";
$lang_id=mysql_query($query1) or die(mysql_error());


$query2="select crop_name from crop_master where lang_id=$lang_id";
$result2=mysql_query($query2) or die(mysql_error());

while($row=mysql_fetch_assoc($result2))
{
    $output[]=$row;
}

print(json_encode($output));

mysql_close();

?>

Logcat で次のようなエラーが発生します。

02-16 22:08:04.216: I/HTTP ok(1251): org.apache.http.message.BasicHttpResponse@4052f0b8 02-16 22:08:04.216: I/JsonObj(1251): エラーが発生しましたSQL 構文; 1 行目の 'id #4' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

構文の何が問題なのかわかりません。

編集: 提案どおりに PDO を使用し、正常に動作しました: これは私の新しいスクリプトです。

<?php


$db = new PDO('mysql:host=localhost;dbname=farm_o_pedia;charset=utf8', 'root', '');

$db->query("SET NAMES utf8");

$lang=$_POST['LanguageName'];

$query1="select crop_name from crop_master where lang_id=(select lang_id from lang_selection where lang_name='$lang')";

$result2=$db->query($query1);

while(($row=$result2->fetch(PDO::FETCH_ASSOC))!=false)
{
    $output[]=$row;
}

print(json_encode($output));

$db=null;

?>
4

2 に答える 2

1
$query2="select crop_name from crop_master where lang_id=$lang_id";

それを次のように置き換えてみてください:

$query2="select crop_name from crop_master where lang_id='$lang_id'";

crop_name$lang_id 自体の値ではなく、lang_id が $lang_id (無効な識別子) と等しい場所を取得しようとしていたようです。

あなたが読みたいと思うかもしれないことに注意してくださいSQL Injection Attacks

たとえば、ユーザーがパラメーター1;DROP TABLE USERSとして渡した場合、 LanguageNameSQL で次のように実行されます。

$query1="select lang_id from lang_selection where lang_name=1;DROP TABLE USERS;
于 2013-02-16T16:43:36.363 に答える
1

クエリの構文についてはよくわかりませんが、2 つではなく 1 つのクエリを使用した方がよいことはわかっています。このようなもの:

select crop_name 
from crop_master cm join lang_selection ls on cm.languageid = ls.languageid
where lang_name = '$lang'

テーブルの結合に慣れていない場合は、本「Teach Yourself SQL in 10 Minutes」について良いことを聞いたことがあります。

于 2013-02-16T16:45:42.617 に答える