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 语法;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“id #4”附近使用正确的语法

我不知道我的语法有什么问题。

编辑:按照建议使用 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_namelang_id 等于 $lang_id (这将是一个无效的标识符)而不是 $lang_id 本身的值。

请注意,您可能需要阅读SQL Injection Attacks

例如,如果用户1;DROP TABLE USERS作为LanguageName参数传入,则将在 SQL 中执行以下操作:

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

我不确定您查询的语法,但我知道您最好使用一个查询而不是两个。像这样的东西:

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

如果你不熟悉连接表,我听说过这本书的好东西,10 分钟内自学 SQL

于 2013-02-16T16:45:42.617 回答