SQL select语句中的语法错误

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): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id #4' at line 1

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

编辑:按照建议使用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;

?>

3
你的脚本可能容易受到 SQL 注入攻击。 - Gumbo
2
请勿在新代码中使用mysql_*函数,它们已经不再维护并被正式弃用。看到红框了吗?相反,学习prepared statements,并使用PDOMySQLi- 这篇文章将帮助您决定选择哪一个。如果您选择PDO,这里有一个好的教程 - Cat
@Eric:谢谢你指出来。我对PHP-MySQL还很陌生,现在会学习PDO了。感谢你的教程。 - apatel
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注入攻击的信息:

例如,如果用户将1;DROP TABLE USERS作为LanguageName参数传递,则以下SQL语句将被执行:

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

$lang_idMySQL 查询结果资源 而不是字符串或数字,这个事实也没有帮助 :) - DCoder
1
我尝试了这个单一的查询语句:select crop_name from crop_master where lang_id=(select lang_id from lang_selection where lang_name='$lang'),它运行良好。但是我会尝试使用PDO。我对PHP很新,并不知道SQL注入的问题。感谢您指出这一点。现在我会使用PDO。 - apatel

1

我不确定你的查询语法,但我知道使用一个查询比使用两个更好。可以像这样:

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

如果您不熟悉连接表格的操作,我听说过一本好书,名称为《10分钟学会SQL》。


1
这个查询也很好用。谢谢你推荐这本书。 - apatel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接