SQL select语句中存在语法错误


Syntax error in SQL select statement

我正在开发一个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正常(1251):org.apache.http.message.BasicHttpResponse@4052f0b802-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;
?>

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

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

如果您不熟悉联接表,我听说过《在10分钟内自学SQL》这本书的优点。

$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作为LanguageName参数传入,则以下内容将在SQL中执行:

$query1="select lang_id from lang_selection where lang_name=1;DROP TABLE USERS;