2010-12-11 113 views
0

我的表“info”有四列用户名,纬度,经度和文件名。我发送一个请求从android(客户端)获取给定的一组用户名,经度和纬度组合的特定文件名,这里是处理请求的代码的php(服务器端)...mysql查询问题

mysql_connect("localhost", "bb", "707") or die(mysql_error()); 
mysql_select_db("test1") or die(mysql_error()); 

$usrnm = $_REQUEST["username"]; 
$lat = $_REQUEST["lat"]; 
$lng = $_REQUEST["lng"]; 

$query = sprintf("SELECT filename FROM info WHERE username = '%s'" 
    ,mysql_real_escape_string($usrnm) 
    ,"AND latitude = %s",mysql_real_escape_string($lat) 
    ,"and longitude = %s",mysql_real_escape_string($lng)); 

$result = mysql_query($query) 
or die(mysql_error()); 

$row = mysql_fetch_array($result); 

echo $row["filename"]; 

这里是问题: 如果我使用上面的查询,返回的文件名仅基于用户名,并且不考虑纬度和经度。简单来说,只有第一个“名称=值”对之后的where子句用于获取文件名...为​​什么?是查询错误还是有其他方法来做到这一点....我使用MYSQL

另一个观察:如果我硬编码的用户名,纬度和经度值,然后它返回正确的文件名...

+1

请注意,您的代码看起来与SQL注入安全的,但不是因为你没有附上$瓦尔在单引号'''的查询字符串内。 – Johan 2011-05-28 22:06:51

+0

@Johan:好,我应该注意到那时我发布了我的答案。 – thirtydot 2011-06-02 00:49:29

回答

1

第一个字符串必须包含所有%s元素,我相信之后的参数正在按发生顺序替换%s。

$query = sprintf("SELECT filename FROM 
    info where username = '%s' and 
    latitude = %s and longitude = %s",mysql_real_escape_string($usrnm)  
    ,mysql_real_escape_string($lat) 
    ,mysql_real_escape_string($lng)); 
+0

你是对的方法,那是错误...它的工作正常...谢谢你.. – Nohsib 2010-12-11 03:46:12

1
<?php 

mysql_connect("localhost", "bb", "707") or die(mysql_error()); 
mysql_select_db("test1") or die(mysql_error()); 

$usrnm = $_REQUEST["username"]; 
$lat = $_REQUEST["lat"]; 
$lng = $_REQUEST["lng"]; 

$query = sprintf(
    "SELECT filename FROM info WHERE username = '%s' 
    AND latitude = '%s' AND longitude = '%s'", 
    mysql_real_escape_string($usrnm), 
    mysql_real_escape_string($lat), 
    mysql_real_escape_string($lng) 
); 

$result = mysql_query($query) or die(mysql_error()); 

$row = mysql_fetch_array($result); 

echo $row["filename"]; 
?> 
+0

谢谢你thirtydot .... – Nohsib 2010-12-11 03:56:41