我遇到了PHP的奇怪行为。基本上我想在PHP脚本中要求一个类。我知道这是直截了当的,我之前做过,但是当我这样做时,它改变了我的jquery(1.8.3)ajax响应的行为。我正在运行wamp设置,我的PHP版本是5.4.6。
以下是我的index.html
的示例head(省略jquery js include)
<script>
$(document).ready(function(){
$('#submit').click(function(){
var action = $('#form').attr('action');
var form_data = {
fname: $('#fname').val(),
lname: $('#lname').val(),
phone: $('#phone').val(),
email: $('#email').val(),
is_ajax: 1
};
$.ajax({
type: $('#form').attr('method'),
url: action,
data: form_data,
success: function(response){
switch(response){
case 'ok':
var msg = 'data saved';
break;
case 'ko':
var msg = 'Oops something wrong happen';
break;
default:
var msg = 'misc:<br/>'+response;
break;
}
$('#message').html(msg);
}
});
return false;
});
});
</script>
体
<div id="message"></div>
<form id="form" action="handler.php" method="post">
<p>
<input type="text" name="fname" id="fname" placeholder="fname">
<input type="text" name="lname" id="lname" placeholder="lname">
</p>
<p>
<input type="text" name="phone" id="phone" placeholder="phone">
<input type="text" name="email" id="email" placeholder="email">
</p>
<input type="submit" name="submit" value="submit" id="submit">
</form>
至于handler.php文件:
<?php
require('class/Container.php');
$filename = 'xml/memory.xml';
$is_ajax = $_REQUEST['is_ajax'];
if(isset($is_ajax) && $is_ajax){
$fname = $_REQUEST['fname'];
$lname = $_REQUEST['lname'];
$phone = $_REQUEST['phone'];
$email = $_REQUEST['email'];
$obj = new Container;
$obj->insertData('fname',$fname);
$obj->insertData('lname',$lname);
$obj->insertData('phone',$phone);
$obj->insertData('email',$email);
$tmp = $obj->give();
$result = $tmp['_obj'];
/*
Push data inside array
*/
$array = array();
foreach($result as $key => $value){
array_push($array,$key,$value);
}
$xml = simplexml_load_file($filename);
// check if there is any data in
if(count($xml->elements->data) == 0){
// if not, create the structure
$xml->elements->addChild('data','');
}
// proceed now that we do have the structure
if(count($xml->elements->data) == 1){
foreach($result as $key => $value){
$xml->elements->data->addChild($key,$value);
}
$xml->saveXML($filename);
echo 'ok';
}else{
echo 'ko';
}
}
?>
Container类:
<?php
class Container{
private $_obj;
public function __construct(){
$this->_obj = array();
}
public function addData($data = array()){
if(!empty($data)){
$oldData = $this->_obj;
$data = array_merge($oldData,$data);
$this->_obj = $data;
}
}
public function removeData($key){
if(!empty($key)){
$oldData = $this->_obj;
unset($oldData[$key]);
$this->_obj = $oldData;
}
}
public function outputData(){
return $this->_obj;
}
public function give(){
return get_object_vars($this);
}
public function insertData($key,$value){
$this->_obj[$key] = $value;
}
}
?>
奇怪的是,我的结果总是属于默认的switch语句,而ajax响应同时适用于当前语句。我注意到,如果我只是将Container类粘贴在handler.php文件的顶部,一切正常,但它有点击败我试图实现的目标。
我尝试了不同的方式来包含Container类,但似乎问题不是特定于当前场景。
我还在学习PHP,我的猜测是我遗漏了一些非常基本的东西。我还搜索了关于我遇到的问题以及PHP.net的stackoverflow,但没有成功。
此致
答案 0 :(得分:1)
我的猜测是你的类文件末尾有空格,这导致输出为“ok”而不是“ok”。这可能是因为使用某些应用程序编辑文件,或者在结束?>
后意外添加空格。尝试一起删除php类中的结束?>
。这不仅是允许的(php会自动在文件的末尾自动结束处理),但是在许多样式指南中经常会鼓励它完全防止你所描述的那种事情。
我通常为这种情况做的另一件事是,我返回一个json字符串,而不是返回一个普通的字符串,jQuery将自动转换成一个javascript对象。这也可以防止,或者至少让你知道你遇到了上述类型的问题。
所以php会像这样回应:
exit( json_encode( array( 'status' => 'ok' ) ) );
和jQuery会这样收到:
$.ajax({
type: $('#form').attr('method'),
url: action,
data: form_data,
dataType: 'json',
success: function(response){
switch(response.status){
case 'ok':
var msg = 'data saved';
break;
case 'ko':
var msg = 'Oops something wrong happen';
break;
default:
var msg = 'misc:<br/>'+response;
break;
}
$('#message').html(msg);
}
});
注意ajax调用中添加的dataType
参数,以及使用response.status
检查我们在PHP中创建的status属性。
这也允许您在响应中返回多个值。您可以在PHP端构建对象或数组,但您基本上会在javascript端获得与javascript对象相同的内容。