我有一个简单的项目,用于在Url重新编写时测试Ajax请求,如下所示:
htaccess:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?param=$1
index.php:
<?php
if (!isset($_GET['param'])){
include('home.php');
}
if (isset($_GET['param'])){
include('tick.php');
}
?>
home.php:
<h1>HOME</h1>
tick.php:
$(document).ready(function ($) {
$.ajax({
type: "POST",
url: "php/request.php",
dataType: "json",
data: {k_name:'book'},
success: function (data) {
//ghtml();
}
})
}
request.php:
<?php
require("config.inc.php");
require("Database.singleton.php");
$k_name=$_POST['k_name'];
$data = array();
//Connect To DB
$db= new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
$db->connect();
$sql = "SELECT id, name FROM table1 WHERE name=$k_name ";
$rows = $db->fetch_array($sql);
foreach($rows as $record){
$data[] = array('id' => $record['id'], 'name' => $record['name']);
}
echo json_encode(array_values($data));
?>
当Url是:
http://localhost/ajax/aaaa
注意:我的文件夹项目名称是Ajax。
Ajax请求工作正常,但在Url中使用斜杠时:
http://localhost/ajax/aaaa/
Ajax请求崩溃,我现在必须使用框架来减少请求调度,但我不明白这个问题为什么会发生。
答案 0 :(得分:0)
你没有崩溃AJAX。您的代码中存在sql injection attack漏洞并且缺少任何形式的错误处理:
您直接将AJAX值插入查询中:
$sql = "SELECT id, name FROM table1 WHERE name=$k_name ";
^^^^^^^
导致查询:
SELECT ... WHERE name=foo
除非您的表中有一个名为foo
的字段,否则会导致语法错误并终止查询。但是,由于您没有任何错误处理,您只需假设查询永远不会失败并继续处理错误的数据。
您可能已经让fetch
个调用吐出有关调用非对象输出方法的PHP警告。并且由于您调用JS代码期望JSON返回作为响应,该错误将导致JSON解析错误,等等等等。
简而言之,如果您对最小的基本错误处理感到困扰,这可能会被阻止:
if (query failed) {
output json error message
} else {
process query results
}
从不永远假设成功。总是假设失败,并将成功视为一个惊喜。有一种方法可以使查询成功,并且几乎有无数种方法可以使其失败。欢迎您来到拉斯维加斯的赌场,因为您将这种无穷无尽的机会视为“保证成功”。