这是针对Android应用程序的,我使用的是用php编写的web服务。我有3个php脚本-dbconnect.php(它有所有的db变量)、login.php(它验证用户凭据并打开会话)和showCases.php(它将返回从login.php脚本获得的userID变量的票证列表)
然而,由于某种原因,当我请求信息showCases.php时,我遇到了:"用户'ODBC'@'localhost'(使用密码:NO)访问被拒绝"。我不太确定会话是否被正确使用。
以下是login.php脚本:
//Displaying the error if sql query is incorrect
if(!$result){
die(mysql_error());
}else{
$row = mysql_fetch_assoc($result);
$first_name = $row['first_name'];
$id = $row['id'];
}
//If found, number of rows must be 1
if($num_rows==0){
$success = 0;
}else{
//creating session
session_start();
session_register("$username");
session_register("$password");
$success = 1;
}
$arr = array(
array('username' => $username, 'id'=>$id,'success'=>$success, 'first_name'=>$first_name));
#array('success'=> $success));
echo json_encode((array('Username'=>$arr)));
mysql_close();
?>
该脚本将用户名数组返回给android应用程序,以便其处理验证。经过验证后,android应用程序将从这个php脚本中请求票证。
session_start();
#require('dbconnect.php');
require_once('login.php');
$response=array();
$response['infos'] = array();
//execute the SQL query and return records
$result = mysql_query("SELECT cases.id, cases.account_id.... casesvisibility.user_id = '$id'......";
//Displaying the error if sql query is incorrect
if(!$result){
die(mysql_error());
}
$num_rows = mysql_num_rows($result);
$arr = array();
if($num_rows!=0){
while ($row = mysql_fetch_assoc($result)) {
$arr['cases_id']=$row['cases.id'];
$infos[]=$arr;
}
}else{
#$arr['existingCases']=$row['0'];
$arr['cases_id']=0;
$infos[]=$arr;
}
#Echoing a JSONArray
print(json_encode(array('Cases'=>$infos)));
//close the connection
mysql_close();
?>
对于我希望它实现的功能,我不太确定这是一个写得很好的代码。当我从android应用程序调用这个脚本时,我首先从登录脚本中获得JSON_array,它告诉我:
{"Username":[{"username":"","id":null,"success":0,"first_name":null}]}id is
Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in E:'wamp'www'mobile.dcl.mu'webserver'showCases.php on line 18
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in E:'wamp'www'mobile.dcl.mu'webserver'showCases.php on line 18
用户"ODBC"@"本地主机"的访问被拒绝(使用密码:NO)
我知道我正在尝试使用另一个php脚本中的变量。
你能帮我解决这个问题吗?
感谢
在哪里创建$num_rows
?也许你想把这段代码放在login.php的顶部:
//Displaying the error if sql query is incorrect
if(!$result){
die(mysql_error());
}else{
$num_rows = mysql_num_rows($result);
if ($num_rows) {
$row = mysql_fetch_assoc($result);
$first_name = $row['first_name'];
$id = $row['id'];
}
}
我认为您混淆了会话和数据库连接(如果我正确理解您的代码片段)。
请记住,对于服务器来说,每个请求都是一个全新的过程。您可以通过会话共享变量,但不能像数据库连接那样共享进程绑定资源。
正如您的服务器告诉您的那样,在第二个请求中没有密码,甚至可能给出了错误的(默认?)db用户。
所以,你需要做的只是:
在每个可能的执行路径中提供数据库连接信息。即,如果您的android应用程序调用http://your.server/showCases.php直接在showCases.php中包含dbconnect.php。
我想你有过一次:在你的第二个脚本中,你有这样一行:
#require('dbconnect.php');
再次尝试取消注释,这可能会让你离目标更近一步。
附言:纯mysql_*
函数已被弃用,请阅读php.net文档(或此处的其他问题)了解有关这些函数的安全问题。升级脚本以使用PDO或mysqli
您的数据库连接调用很可能存在问题,您没有提供正确的用户名和/或密码。我怀疑密码丢失了。检查数据库连接
$db_host = "localhost"; // database host
$db_name = "test"; // database name
$db_login = "root"; // database user
$db_pass= "*****"; // database password
$db = mysql_connect($db_host, $db_login, $db_pass);
mysql_select_db($db_name,$db);
这只是指示我所指内容的示例代码。此外,请确保在每个php文件中都包含此db连接文件。有多种方法可以使数据库连接可用于不同的php文件(在其中进行sql调用)