slim 无法收到来自服务器的响应
can't receive response from server in slim
我们正在使用 php-框架 "slim" 来构建电子商店。现在我们遇到一个问题,我们可以向服务器发送请求并修改数据库(我们检查了 table 确实改变了),而 web 端无法从数据库获取响应(iOS 和 android end 都可以得到)。这是发送请求、更新数据库和获取响应的代码部分:
$app->post('/tblUser', function($request, $response, $args) {
get_tblUser_id($request->getParsedBody());
});
function get_tblUser_id($data)
{
$db = connect_db();
$sql = "update tblphoneverify set dtCreate = NOW() where strPhone = $data[phone]";
$db->query($sql);
$updateId = $db->affected_rows;
$db = null;
$msg = array(
'stat' => '',
'msg' => ''
);
$msg['stat'] = '1';
$msg['msg'] = 'registration success';
return json_encode($msg);
}
然后这个ajax段触发点击事件执行post并接收结果的状态:
$(function(){
$("#getcheck").click(function(){
$.ajax({
type:"post",
url:"http://192.168.1.108/blue/public/tblUser",
data: {"phone":"13331111111"},
dataType:"json",
//async:false,
contentType: "application/x-www-form-urlencoded",
success:function(data){
alert(1);
},
error:function(XMLHttpRequest, textStatus, errorThrown){
alert(XMLHttpRequest.readyState);
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.statusText);
alert(XMLHttpRequest.responseText);
alert(textStatus);
alert(errorThrown);
}
})
})
})
代码总是跳过"success"部分,直接跳转到"error"。
那么我们的代码有什么问题呢?提前致谢。
您应该从可调用路由发送响应。不要 json_encode
自己做,而是让 Slim 去做。
首先,return 来自 get_tblUser_id
的数组:
function get_tblUser_id($data)
{
$db = connect_db();
$sql = "update tblphoneverify set dtCreate = NOW() where strPhone = $data[phone]";
$db->query($sql);
$updateId = $db->affected_rows;
$db = null;
$msg = array(
'stat' => '',
'msg' => ''
);
$msg['stat'] = '1';
$msg['msg'] = 'registration success';
return $msg;
}
请注意,这里存在 SQL 注入漏洞。将 SQL 更改为如下内容:
$sql = "update tblphoneverify set dtCreate = NOW() where strPhone = ?";
$db->query($sql, [$data[phone]]);
接下来,您需要从可调用路由发送响应 JSON。 Slim 有一个方法可以做到这一点:
$app->post('/tblUser', function($request, $response, $args) {
$msg = get_tblUser_id($request->getParsedBody());
return $response->withJson($msg);
});
Slim 现在将使用正确的 content-type header 集发回您的 msg
数组,这应该有助于您的 JavaScript 对其进行解码。
我们正在使用 php-框架 "slim" 来构建电子商店。现在我们遇到一个问题,我们可以向服务器发送请求并修改数据库(我们检查了 table 确实改变了),而 web 端无法从数据库获取响应(iOS 和 android end 都可以得到)。这是发送请求、更新数据库和获取响应的代码部分:
$app->post('/tblUser', function($request, $response, $args) {
get_tblUser_id($request->getParsedBody());
});
function get_tblUser_id($data)
{
$db = connect_db();
$sql = "update tblphoneverify set dtCreate = NOW() where strPhone = $data[phone]";
$db->query($sql);
$updateId = $db->affected_rows;
$db = null;
$msg = array(
'stat' => '',
'msg' => ''
);
$msg['stat'] = '1';
$msg['msg'] = 'registration success';
return json_encode($msg);
}
然后这个ajax段触发点击事件执行post并接收结果的状态:
$(function(){
$("#getcheck").click(function(){
$.ajax({
type:"post",
url:"http://192.168.1.108/blue/public/tblUser",
data: {"phone":"13331111111"},
dataType:"json",
//async:false,
contentType: "application/x-www-form-urlencoded",
success:function(data){
alert(1);
},
error:function(XMLHttpRequest, textStatus, errorThrown){
alert(XMLHttpRequest.readyState);
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.statusText);
alert(XMLHttpRequest.responseText);
alert(textStatus);
alert(errorThrown);
}
})
})
})
代码总是跳过"success"部分,直接跳转到"error"。 那么我们的代码有什么问题呢?提前致谢。
您应该从可调用路由发送响应。不要 json_encode
自己做,而是让 Slim 去做。
首先,return 来自 get_tblUser_id
的数组:
function get_tblUser_id($data)
{
$db = connect_db();
$sql = "update tblphoneverify set dtCreate = NOW() where strPhone = $data[phone]";
$db->query($sql);
$updateId = $db->affected_rows;
$db = null;
$msg = array(
'stat' => '',
'msg' => ''
);
$msg['stat'] = '1';
$msg['msg'] = 'registration success';
return $msg;
}
请注意,这里存在 SQL 注入漏洞。将 SQL 更改为如下内容:
$sql = "update tblphoneverify set dtCreate = NOW() where strPhone = ?";
$db->query($sql, [$data[phone]]);
接下来,您需要从可调用路由发送响应 JSON。 Slim 有一个方法可以做到这一点:
$app->post('/tblUser', function($request, $response, $args) {
$msg = get_tblUser_id($request->getParsedBody());
return $response->withJson($msg);
});
Slim 现在将使用正确的 content-type header 集发回您的 msg
数组,这应该有助于您的 JavaScript 对其进行解码。