因此,在一个文件中,我有一个您添加到数据库中的表单,另一个您检索的表单,以及另一个您更新的表单。所有表单都使用javascript(ajax)向一些php文件发送信息。
例如:
//添加数据
function get(str) {
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("txtuser").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", "ajaxget.php?q=" + str, true);
xmlhttp.send();
}
//更新数据
function update() {
var ud_id = $('.ud_id').attr('value');
var ud_first = $('.ud_first').attr('value');
var ud_last = $('.ud_last').attr('value');
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("txtuser").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", "ajaxupdate.php?ud_id=" + ud_id + "&ud_first=" + ud_first + "&ud_last=" + ud_last , true);
xmlhttp.send();
return false;
}
//添加新数据
function add() {
var add_ud_first = $('.add_ud_first').attr('value');
var add_ud_last = $('.add_ud_last').attr('value');
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("txtuser").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", "ajaxadd.php?add_ud_first=" + add_ud_first + "&add_ud_last=" + add_ud_last , true);
xmlhttp.send();
return false;
}
正如您所看到的,所有片段都相应地发送到ajaxget.php
、ajaxupdate.php
和ajaxadd.php
我可以合并这些文件吗?这样我就有了所有代码段调用的1个php
例如,所有的代码片段都会调用ajax.php文件,在该文件中,如果get()调用了它,那么就相应地执行。
这有道理吗?
这里有一个ajaxget.php文件:
<?php include("connection.php");
$q=$_GET["q"];
$query="SELECT * FROM contacts WHERE id = '".$q."'";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo "Name: " . $row['first'] . " <br />";
echo "Surname: " . $row['last'] . " <br />";
}
mysql_close();
?>
在请求中添加一个参数(POST或GET)以确定请求的类型。
例如,如果您发送一个GET参数(?operation=insert
),那么在PHP代码中,您应该使用开关/if-else来执行正确的代码。
$allowed_operations = array('insert', 'update', 'delete');
if( isset($_GET['operation'])
&& in_array(isset($_GET['operation']), $allowed_operations)){
switch($_GET['operation']){
case 'insert':
// do insert operation here
break;
case 'update':
// do update operation here
break;
case 'delete':
//do delete operation here
break;
}
}
编辑1
- 将
ajaxget.php
、ajaxupdate.php
和ajaxadd.php
的所有代码放在ajaxop.php
或其他任何代码中 - 保持函数
ajax_get()
中的ajaxget.php
内容,其他内容相同 - 更改
xmlhttp.open
,使其仅调用ajaxop.php
,并根据需要在URI中添加operation=get
、operation=update
等 - 将这些参数映射到switch语句中
非常简单的方法:
<?php
$action = 'list';
$arrActions = array ('list', 'add', 'update', 'delete');
if(isset($_GET['action']) && in_array($_GET['action'],$arrActions)) {
include('ajax_action_'.$_GET['action'].'.php');
} else {
include('ajax_action_list.php');
}
?>
有了这样一个简单的文件,你可以将你的请求"路由"到其他文件,并在内部处理这些文件。还有很多事情需要考虑,但如果你刚开始,保持简单,然后你就可以在适当的时候为你的应用程序选择你需要的元素。
更新
提出了一个关于文件数量的问题:
这可能会有所帮助:
<?php
include("connection.php");
class controller {
private $arrMethods = array('get','list','add','update','delete');
public function __construct() {
if(isset($_GET['action'])) {
$method = 'do'.ucwords($_GET['action']); // list=>List, add=>Add, etc
if(method_exists($method,$this)) {
$this->$method();
}
}
public function doGet () {
$q=(int)(isset($_GET['q']) ? $_GET["q"] : 0);
if(0 < (int)$q) {
$query="SELECT * FROM `contacts` WHERE `id` = '$q'"; // limit to 1?
$result = mysql_query($query);
if($result && mysql_error()=='' && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_array($result)) {
echo "Name: " . stripslashes($row['first']) . " <br />";
echo "Surname: " . stripslashes($row['last']) . " <br />";
}
}
mysql_close();
}
}
public function doList () {
}
public function doAdd () {
}
public function doEdit () {
}
public function doDelete () {
}
}
$objController = new controller();
?>
现在,这将成为您的网关脚本,每个函数都被分离出来。
这会给你一个更好的起点吗?
添加一个参数?action=add
或其他任何参数。php脚本可以对其进行检查,并使用q
参数调用适当的函数。但在你做任何其他事情之前,谷歌"SQL注入攻击"
<?php
$action = $_GET['action']
if $action == 'add' {
// add code
}
elseif $action == 'update' {
// update code
}
elseif $action == 'delete' {
// delete code
}
看起来您正在尝试构建类似RESTapi的东西。我建议你检查一下这个:http://www.slimframework.com,以及有关RESTful接口的信息的其他来源。当像Backbone这样的前端JavaScript框架能够以最小的麻烦半自动地理解数据时,使用RESTapi在浏览器和服务器之间修改数据也会带来额外的好处。
只要说。