2013-02-16 166 views
4

我正在开发一个Android应用程序。在我的应用程序中,AsyncTask向PHP发送一个字符串。 PHP返回一组作物名称。SQL select语句中的语法错误

我的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):组织。 [email protected] 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; 

?> 
+3

您的脚本可能容易受到SQL注入。 – Gumbo 2013-02-16 16:45:44

+2

[**请不要在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsql)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 – Eric 2013-02-16 16:46:50

+0

@Eric:thanx指出。我是这个PHP-MySql的新手。现在将学习PDO。 Thanx为教程。 – apatel 2013-02-18 03:51:06

回答

1

我不确定你的查询的语法,但我知道你最好用一个查询而不是两个查询。事情是这样的:

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

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

+1

此查询也正常工作。并提供建议这本书的好处。 – apatel 2013-02-18 03:55:48

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通过为LanguageName参数将在SQL中执行以下操作:

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

'$ lang_id'是* MySQL结果资源*而不是字符串/数字的事实也无助于:) – DCoder 2013-02-16 16:48:54

+1

我试过这个单一查询:从crop_master中选择crop_name lang_id =(从lang_selection中选择lang_id,其中lang_name =' $ lang')而且它的工作正常。但我会尝试PDO。我是这个PHP的新手,并不知道SQL注入。感谢您指出这一点。现在将去PDO。 – apatel 2013-02-18 03:43:16