2012-08-02 103 views
0

我正尝试使用PHP连接到MySQL,从Android传递数据库连接参数。我不想对连接参数进行硬编码,也不想将它们存储在单独的文件中。当我在PHP中有数据库参数时,我的代码工作正常,但现在不能工作,因为我试图通过名称值对将它们从Java传递到PHP,如下所示。如何将namevaluepairs中的MySQL数据库连接数据从Android传递到PHP

除了使用传递变量而不是硬编码的PHP连接外没有任何变化,所以我怀疑有些格式化或REGEX问题,但找不到任何解决方案。任何帮助非常感谢!

根据VolkerK的协助解决问题。查看原始的PHP代码并在下面更新。

ORIGINAL SQLQuery.php:

<?php 
mysql_connect($_REQUEST['url'],$_REQUEST['username'],$_REQUEST['password']); 
mysql_select_db($_REQUEST['database']); 
$q=mysql_query($_REQUEST['SQL']); 
while($e=mysql_fetch_assoc($q)) 
     $output[]=$e; 
print(json_encode($output)); 
mysql_close(); 
?> 

工作SQLQuery.php:

<?php 
if (get_magic_quotes_gpc()) { 
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); 
    while (list($key, $val) = each($process)) { 
     foreach ($val as $k => $v) { 
      unset($process[$key][$k]); 
      if (is_array($v)) { 
       $process[$key][stripslashes($k)] = $v; 
       $process[] = &$process[$key][stripslashes($k)]; 
      } else { 
       $process[$key][stripslashes($k)] = stripslashes($v); 
      } 
     } 
    } 
     unset($process); 
} 

define('DEBUGLOG', true); 
$output = array(); 

$mysql = mysql_connect($_REQUEST['url'],$_REQUEST['username'],$_REQUEST['password']); 
if (!$mysql) { 
    $output['status']='Error'; 
    $output['errormsg']='MySQL connect error'; 
    if (defined('DEBUGLOG') && DEBUGLOG) { 
     $output['errordetails'] = array( 
      'msg'=>mysql_error(), 
      'url'=>$_REQUEST['url'], 
      'username'=>$_REQUEST['username'], 
      'password'=>$_REQUEST['password'] 
     ); 
    } 
} 
else if (!mysql_select_db($_REQUEST['database'])) { 
    $output['status']='Error'; 
    $output['errormsg']='Database select error'; 
    if (defined('DEBUGLOG') && DEBUGLOG) { 
     $output['errordetails'] = array( 
      'msg'=>mysql_error(), 
      'url'=>$_REQUEST['url'], 
      'database'=>$_REQUEST['database'] 
     ); 
    } 
} 
else if (false===($q=mysql_query($_REQUEST['SQL']))) { 
    $output['status']='Error'; 
    $output['errormsg']='Query error'; 
    if (defined('DEBUGLOG') && DEBUGLOG) { 
     $output['errordetails'] = array( 
      'msg'=>mysql_error(), 
      'url'=>$_REQUEST['url'], 
      'SQL'=>$_REQUEST['SQL'] 
     ); 
    } 
} 
else { 
    while($e=mysql_fetch_assoc($q)) { 
     $output[]=$e; 
    } 
} 

print(json_encode($output)); 

从我的Android代码(!细节改变,以保护无辜)提取物:

String phpDBURL = "mysqlserver.blah.com:3306"; 
String phpURL = "http://www.blah.com/php/"; 
String dbname ="dbref_Evaluate"; 
String username = "dbref_admin"; 
String password = "password"; 
String SQL = "SELECT ID, ShortDesc FROM User WHERE Account = '[email protected]'"; 
//the query to send 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
nameValuePairs.add(new BasicNameValuePair("url",phpDBURL)); 
nameValuePairs.add(new BasicNameValuePair("username",username)); 
nameValuePairs.add(new BasicNameValuePair("password",password)); 
nameValuePairs.add(new BasicNameValuePair("database",dbname)); 
nameValuePairs.add(new BasicNameValuePair("SQL",SQL)); 
Log.v("Common.SQLQuery", "Passing parameters: " + nameValuePairs.toString()); 
//http post 
try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(phpURL + "SQLQuery.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     InputStream is = entity.getContent(); 
//convert response to string 

等等。

+0

'mysql_'将被弃用,从PHP,http://www.php.net/manual/en/faq.databases.php#faq.databases除去。 mysql.deprecated。学习使用PDO,而不是http://anuary.com/54/input-sanitization-and-escaping-for-database-and-stdout-using-php – Gajus 2012-08-02 12:37:23

回答

0

您需要 更多 错误处理。 任何mysql_ *函数都可能失败,您的代码必须对此作出反应。

原油例如:

<?php 
define('DEBUGLOG', true); 
$output = array(); 

$mysql = mysql_connect($_REQUEST['url'],$_REQUEST['username'],$_REQUEST['password']); 
if (!$mysql) { 
    $output['status']='error'; 
    $output['errormsg']='database error'; 
    if (defined('DEBUGLOG') && DEBUGLOG) { 
     $output['errordetails'] = array(
      'msg'=>mysql_error(), 
      'url'=>$_REQUEST['url'], 
      'username'=>$_REQUEST['username'], 
      'password'=>$_REQUEST['password'] 
     ); 
    } 
} 
else if (!mysql_select_db($_REQUEST['database'])) { 
    $output['status']='error'; 
    $output['errormsg']='database error'; 
    if (defined('DEBUGLOG') && DEBUGLOG) { 
     $output['errordetails'] = array(
      'msg'=>mysql_error(), 
      'url'=>$_REQUEST['url'], 
      'database'=>$_REQUEST['database'] 
     ); 
    } 
} 
else if (false===($q=mysql_query($_REQUEST['SQL']))) { 
    $output['status']='error'; 
    $output['errormsg']='database error'; 
    if (defined('DEBUGLOG') && DEBUGLOG) { 
     $output['errordetails'] = array(
      'msg'=>mysql_error(), 
      'url'=>$_REQUEST['url'], 
      'SQL'=>$_REQUEST['SQL'] 
     ); 
    } 
} 
else { 
    while($e=mysql_fetch_assoc($q)) { 
     $output[]=$e; 
    } 
} 

print(json_encode($output)); 
+0

感谢您的全面回复。我把这个错误处理放在里面,奇怪的是它指向了一个PHP/Java/SQL中的一个错误,我没有改变!我收到以下错误响应: – user1570952 2012-08-02 11:10:10

+0

结果:{“status”:“error”,“errormsg”:“数据库错误”,“errordetails”:{“msg”:“您的SQL语法错误;对应于您的MySQL服务器版本,以便在第1行'\\ [email protected] \\''附近使用正确的语法“,”url“:”mysql.blah.com:3306","SQL“: “SELECT ID,姓名来自用户WHERE帐户= \\'[email protected] \\'”}} – user1570952 2012-08-02 11:11:50

+0

该错误已编码在SQL中传递的电子邮件/帐户地址。我认为namevaluepair没有编码,因为MySQL显然会有问题。所以我不知道什么是语法错误的来源。 – user1570952 2012-08-02 11:21:10

1

使用POST而不是PHP文件中的REQUEST

+0

你是否改变了请求发布 – 2012-08-02 10:11:38

+0

我试过这个,但它做了没有不同。我有REQUEST为查询和它的工作,所以使用REQUEST时,我添加数据库参数,假设这应该也得到这些变量传递(不正确的逻辑??)。 – user1570952 2012-08-02 10:51:47

+0

要清楚:尝试更改为POST为mysql_connect - >没有影响。尝试更改为POST为mysql_select_db - >组合更改没有影响。对于好的措施,尝试更改为POST的mysql_query,并没有影响。 – user1570952 2012-08-02 10:54:13