PHP 在 android 设备上使用 nusoap 网络服务时没有创建会话变量
PHP Session variables are not creating while using nusoap webservice from android device
我有一个 nu_soap Web 服务,我想用它创建并发送验证码和图像。
我正在使用 getcaptcha
网络服务将生成的验证码和验证码 ID 放入会话变量中,并通过使用另一个名为 validateCaptcha
的网络服务来检查它是否有效与否,
问题是当我使用 Firefox Soa 客户端插件检查我的 Web 服务时,Web 服务工作正常并且所有会话变量都工作正常。
但是当我尝试使用 android phone 检查它时,会话变量未定义或为空。
获取验证码:
<?php
session_start();
include_once('./Utility/DBM.php');
include_once('captcha.class.php');
class getCaptcha extends DBM
{
public function getcaptchacode($dump)
{
//creating and generating captcha image and code
$img = createcaptcha();
//Creating Captcha Id
$CaptchaId = (mt_rand(1,1000) . "1234");
imagepng($img[0],'Captcha/'.$CaptchaId.'.png');
imagedestroy($img[0]);
//encoding to base64 and getting file content
$base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png'));
//setting up session for captcha
$_SESSION['Captcha_Code']=$img[0];
$_SESSION['Captcha_ID']=$CaptchaId;
$img[]='';
$captcha=$base64;
$captchaId = $CaptchaId;
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$captcha</captcha>";
$this->strResult.="<captcha_Id>$captchaId</captcha_Id>";
$this->strResult.="</captcha>";
}
function __toString()
{
if($this->strResult!=""){
return $this->strResult;
}
return "";
}
}
?>
验证验证码:
<?php
session_start();
include_once('./Utility/DBM.php');
class validateCaptcha extends DBM
{
public function validatecaptcha($CaptchaCode,$Captcha_Id)
{
if(($CaptchaCode!=""&&$CaptchaCode==$_SESSION['Captcha_Code'])&&($Captcha_Id!=""&&$Captcha_Id==$_SESSION['Captcha_ID']))
{
$msg="Captcha is correct";
//generating a Token using md5 & salt
$hash = md5(mt_rand(1,1000000) . "123456");
$token=$_SESSION['CapToken'] = $hash;
//starting token session time
$_SESSION['Token_time'] = time();
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
}
else
{
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
//destroying all session
//session_destroy();
$msg="Wrong Captcha Entered";
$token="";
}
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$msg</captcha>";
$this->strResult.="<token>$token</token>";
$this->strResult.="</captcha>";
}
function __toString()
{
if($this->strResult!=""){
return $this->strResult;
}
return "";
}
}
?>
我找到了这个问题的解决方案,我想post在这里供其他人使用。
我没有使用会话变量,而是使用 mysql 数据库来存储验证码 (id,code,token,expire_time) 然后我使用 php date() 函数来检查验证码时间未过期且有效,在验证 Web 服务中,我使用数据库中的 mysql 到 select 来检查验证码是否有效。
验证码:
class validateCaptcha extends DBM
{
public function validatecaptcha($CaptchaCode,$Captcha_Id)
{
$select_captcha = $this->select("captchaid,code,token,expire", "captcha", "code='$CaptchaCode' AND captchaid='$Captcha_Id'", 0, 0);
$captcha_check=mysql_num_rows($select_captcha);
$row = mysql_fetch_assoc($select_captcha);
if($captcha_check)
{
$msg="Captcha is correct";
$token=$row['token'];
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
}
else
{
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
$msg="Wrong Captcha Entered";
$token="";
}
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$msg</captcha>";
$this->strResult.="<token>$token</token>";
$this->strResult.="</captcha>";
}
获取验证码:
class getCaptcha extends DBM
{
public function getcaptchacode($dump)
{
//creating and generating captcha image and code
$img = createcaptcha();
//Creating Captcha Id
$CaptchaId = (mt_rand(1,1000) . "1234");
imagepng($img[0],'Captcha/'.$CaptchaId.'.png');
imagedestroy($img[0]);
//encoding to base64 and getting file content
$base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png'));
//generating a Token using md5 & salt
$hash = md5(mt_rand(1,1000000) . "123456");
$token=$_SESSION['CapToken'] = $hash;
//Getting time
$getime=date('Y-m-d H:i:s');
//inserting into captcha table
$this->RunQuery("INSERT INTO captcha (captchaid,code,token,expire) VALUES ('$CaptchaId','$img[1]','$token','$getime')", true, false);//TODO query
if (mysql_insert_id())
$Response = 'True';
else
$Response = 'False';
//deleting inactive captcha for 15 minutes
$this->RunQuery("DELETE FROM captcha WHERE expire < DATE_SUB(NOW(), INTERVAL 15 MINUTE)",true,false);
$img[]='';
$captcha=$base64;
$captchaId = $CaptchaId;
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$captcha</captcha>";
$this->strResult.="<captcha_Id>$captchaId</captcha_Id>";
$this->strResult.="<Response>$Response</Response>";
$this->strResult.="</captcha>";
}
我有一个 nu_soap Web 服务,我想用它创建并发送验证码和图像。
我正在使用 getcaptcha
网络服务将生成的验证码和验证码 ID 放入会话变量中,并通过使用另一个名为 validateCaptcha
的网络服务来检查它是否有效与否,
问题是当我使用 Firefox Soa 客户端插件检查我的 Web 服务时,Web 服务工作正常并且所有会话变量都工作正常。
但是当我尝试使用 android phone 检查它时,会话变量未定义或为空。
获取验证码:
<?php
session_start();
include_once('./Utility/DBM.php');
include_once('captcha.class.php');
class getCaptcha extends DBM
{
public function getcaptchacode($dump)
{
//creating and generating captcha image and code
$img = createcaptcha();
//Creating Captcha Id
$CaptchaId = (mt_rand(1,1000) . "1234");
imagepng($img[0],'Captcha/'.$CaptchaId.'.png');
imagedestroy($img[0]);
//encoding to base64 and getting file content
$base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png'));
//setting up session for captcha
$_SESSION['Captcha_Code']=$img[0];
$_SESSION['Captcha_ID']=$CaptchaId;
$img[]='';
$captcha=$base64;
$captchaId = $CaptchaId;
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$captcha</captcha>";
$this->strResult.="<captcha_Id>$captchaId</captcha_Id>";
$this->strResult.="</captcha>";
}
function __toString()
{
if($this->strResult!=""){
return $this->strResult;
}
return "";
}
}
?>
验证验证码:
<?php
session_start();
include_once('./Utility/DBM.php');
class validateCaptcha extends DBM
{
public function validatecaptcha($CaptchaCode,$Captcha_Id)
{
if(($CaptchaCode!=""&&$CaptchaCode==$_SESSION['Captcha_Code'])&&($Captcha_Id!=""&&$Captcha_Id==$_SESSION['Captcha_ID']))
{
$msg="Captcha is correct";
//generating a Token using md5 & salt
$hash = md5(mt_rand(1,1000000) . "123456");
$token=$_SESSION['CapToken'] = $hash;
//starting token session time
$_SESSION['Token_time'] = time();
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
}
else
{
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
//destroying all session
//session_destroy();
$msg="Wrong Captcha Entered";
$token="";
}
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$msg</captcha>";
$this->strResult.="<token>$token</token>";
$this->strResult.="</captcha>";
}
function __toString()
{
if($this->strResult!=""){
return $this->strResult;
}
return "";
}
}
?>
我找到了这个问题的解决方案,我想post在这里供其他人使用。
我没有使用会话变量,而是使用 mysql 数据库来存储验证码 (id,code,token,expire_time) 然后我使用 php date() 函数来检查验证码时间未过期且有效,在验证 Web 服务中,我使用数据库中的 mysql 到 select 来检查验证码是否有效。
验证码:
class validateCaptcha extends DBM
{
public function validatecaptcha($CaptchaCode,$Captcha_Id)
{
$select_captcha = $this->select("captchaid,code,token,expire", "captcha", "code='$CaptchaCode' AND captchaid='$Captcha_Id'", 0, 0);
$captcha_check=mysql_num_rows($select_captcha);
$row = mysql_fetch_assoc($select_captcha);
if($captcha_check)
{
$msg="Captcha is correct";
$token=$row['token'];
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
}
else
{
//destroying captcha image
unlink('./Captcha/'.$Captcha_Id.'.png');
$msg="Wrong Captcha Entered";
$token="";
}
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$msg</captcha>";
$this->strResult.="<token>$token</token>";
$this->strResult.="</captcha>";
}
获取验证码:
class getCaptcha extends DBM
{
public function getcaptchacode($dump)
{
//creating and generating captcha image and code
$img = createcaptcha();
//Creating Captcha Id
$CaptchaId = (mt_rand(1,1000) . "1234");
imagepng($img[0],'Captcha/'.$CaptchaId.'.png');
imagedestroy($img[0]);
//encoding to base64 and getting file content
$base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png'));
//generating a Token using md5 & salt
$hash = md5(mt_rand(1,1000000) . "123456");
$token=$_SESSION['CapToken'] = $hash;
//Getting time
$getime=date('Y-m-d H:i:s');
//inserting into captcha table
$this->RunQuery("INSERT INTO captcha (captchaid,code,token,expire) VALUES ('$CaptchaId','$img[1]','$token','$getime')", true, false);//TODO query
if (mysql_insert_id())
$Response = 'True';
else
$Response = 'False';
//deleting inactive captcha for 15 minutes
$this->RunQuery("DELETE FROM captcha WHERE expire < DATE_SUB(NOW(), INTERVAL 15 MINUTE)",true,false);
$img[]='';
$captcha=$base64;
$captchaId = $CaptchaId;
$this->strResult = "";
$this->strResult.="<captcha>";
$this->strResult.="<captcha>$captcha</captcha>";
$this->strResult.="<captcha_Id>$captchaId</captcha_Id>";
$this->strResult.="<Response>$Response</Response>";
$this->strResult.="</captcha>";
}