我对服务器端脚本和Ajax还是很陌生。我想知道的是,我可以对同一个文件进行多个ajax调用,但是通过我的ajax调用,只能读取该文件中的某个脚本来执行该特定的ajax调用吗?我想知道这是因为,当我进行ajax调用时,它也会解析脚本的整个代码,这也是在进行ajax调用,而不是其他ajax调用脚本内部的特定代码。
现在,我可以通过简单地制作一个新文件并将我的ajax调用指向单独的文件来完全解决此问题,但这不算是不良的体系结构吗?例如,一个对editusers.js的ajax调用,另一个对deleteusers.js的ajax调用,为什么不简单地在一个文件中包含所有不同的ajax调用?
这是我的代码,我在服务器端渲染PDO而不是mysqli时使用引导数据表。第一个ajax调用用于查询表中的所有记录,第二个ajax调用用于编辑表本身内的用户记录。但是,我停止编辑用户记录功能是因为我想知道是否有可能实现这一目标?
HTML和JavaScript
<script type="text/javascript">
$(document).ready(function() {
$('#userDetails').DataTable({
"scrollY": "400px",
"scrollCollapse": true,
"processing": true,
"serverSide": true,
"ajax": {
"url": "../user-actions-script.php",
"type": "post",
},
"deferRender": true,
oLanguage: {sProcessing: "<i class='fas fa-spinner fa-3x' id='loader'></i>"},
});
$(document).on('click', 'i.fas.fa-edit', function(e){
$.ajax({
url: '../user-actions-script.php',
success: function(){
console.log('works');
}
})
});
});
</script>
<body>
<div class="fluid-container">
<header>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark"></nav>
</header>
<div class="container">
<h2>User Actions</h2>
<div class="userdetailsContainer">
<table class="table table-dark table-striped table-bordered table-hover" id="userDetails">
<thead>
<!-- adding this in later -->
</thead>
</table>
</div>
<!-- Edit Actions Modal -->
<!-- Modal -->
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="editHeader">
<i class="fas fa-edit fa-2x"></i>
<span>Edit User</span>
</div>
<div class="form-group">
<form
method="POST"
>
<label for="email">Email:</label>
<input
type="email"
class="form-control"
name="email"
>
<label for="fullName">Full Name:</label>
<input
type="text"
class="form-control"
name="fullName"
>
<label for="area">area:</label>
<select
class="form-control"
name="area"
id="area"
>
<?php include ("_global/includes/login_select_options-approved.php") ;?>
</select>
<label for="requestor">Requestor:</label>
<select
class="form-control"
name="requestor"
id="requestor"
>
<?php include ("_global/includes/select_options.php") ;?>
</select>
</div>
</form>
<button
type="submit"
class="btn btn-primary">
Save changes
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
PHP PDO / Ajax脚本
<?php
include "_global/includes/config.php";
// Set all fetch requests as an object by default
$dbo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
// Custom Usergroups Inputs
$admin = 'ADMIN';
$emptyValues = '';
$adminLive = 'ADMIN-live';
$adminType = 'ADMIN_US_Type';
$customusDomestic = 'US_domestic';
$adminChina = 'China_admin';
$adminIndia = 'India_admin';
$adminCustom = 'ADMIN_custom';
$customusaustinCulver = 'US_Austin_Culver';
$customuschinaTokyo = 'US_China_Tokyo';
$customcorkuaeBayarea = 'Cork_UAE_BayArea';
$customchinashanghaiBeijing = 'China_Shanghai_Beijing';
$adminselfMoves = 'ADMIN_selfmoves';
$adminmilanVienna = 'ADMIN-milan-vienna';
$custombayareaSeattle = 'Bayarea_Seattle_admin';
$custombayareaCulver = 'ADMIN_Culver_Bay';
$customculverSingapore = 'ADMIN_Culver_Singapore';
$customcanada = 'ADMIN_canada';
// Datatable serverside processing script
$request = $_REQUEST;
$columns = array(
0 => 'name',
1 => 'email',
2 => 'usergroup',
3 => 'user',
4 => 'DateAdded'
);
// Prepare the query
$sqlAll = 'SELECT mem_id, email, name, usergroup, user, DateAdded
FROM plus_signuptestdata
WHERE usergroup NOT IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
GROUP BY email
ORDER BY dateAdded DESC';
$stmt = $dbo->prepare($sqlAll);
// Execute the query
$stmt->execute([$admin,$emptyValues,$adminLive,$adminType,$customusDomestic,$adminChina,$adminIndia,$adminCustom,$customusaustinCulver,$customuschinaTokyo,$customcorkuaeBayarea,$customchinashanghaiBeijing,$adminselfMoves,$adminmilanVienna,$custombayareaSeattle,$custombayareaCulver,$customculverSingapore,$customcanada]);
// Count Rows
$rowCount = $stmt->rowCount();
// Fetch the query
$totalData = $stmt->fetchAll(PDO::FETCH_ASSOC);
$totalFiltered = $rowCount;
$sqlAll = "SELECT mem_id, email, name, usergroup, user, DateAdded ";
$sqlAll .= " FROM plus_signuptestdata ";
$sqlAll .= " WHERE usergroup NOT IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
if(!empty($request['search']['value'])){
$sqlAll .= " AND name LIKE '%".$request['search']['value']."%' ";
$sqlAll .= " OR email LIKE '%".$request['search']['value']."%'";
}
// Order by with empty or without empty user string
$sqlAll .=" ORDER BY ". $columns[$request['order'][0]['column']]." ".$request['order'][0]['dir']." LIMIT ".$request['start']." ,".$request['length']." ";
$stmt = $dbo->prepare($sqlAll);
// Execute the query
$stmt->execute([$admin,$emptyValues,$adminLive,$adminType,$customusDomestic,$adminChina,$adminIndia,$adminCustom,$customusaustinCulver,$customuschinaTokyo,$customcorkuaeBayarea,$customchinashanghaiBeijing,$adminselfMoves,$adminmilanVienna,$custombayareaSeattle,$custombayareaCulver,$customculverSingapore,$customcanada]);
$totalData = $stmt->fetchAll(PDO::FETCH_ASSOC);
$newData = array();
// Convert all the data to UTF-8 unicode format.
foreach($totalData as $item) {
$nestedData=array();
$nestedData[] = mb_convert_encoding($item['name'], 'UTF-8', 'UTF-8');
$nestedData[] = mb_convert_encoding($item['email'], 'UTF-8', 'UTF-8');
$nestedData[] = mb_convert_encoding($item['usergroup'], 'UTF-8', 'UTF-8');
$nestedData[] = mb_convert_encoding($item['user'], 'UTF-8', 'UTF-8');
$nestedData[] = mb_convert_encoding($item['DateAdded'], 'UTF-8', 'UTF-8');
$nestedData[] = '<i class="fas fa-edit" data-toggle="modal" data-target="#editModal" id="'.$item['mem_id'].'"></i> <i class="fas fa-trash" id="'.$item['mem_id'].'"></i>';
$newData[] = $nestedData;
}
$json_data = array(
"draw" => intval( $request['draw']),
"recordsTotal" => intval( $rowCount ),
"recordsFiltered" => intval( $totalFiltered ),
"data" => $newData
);
echo json_encode($json_data);
// This is fine but what happens when I need to make another ajax call to this file? It'll read all the contents of this script how can I make it to where it reads only certain code within the same file?
答案 0 :(得分:1)
您可以使用if块条件来执行特定的ajax调用,假设您想从第一个ajax调用中执行第一个if块,那么您必须将带有第一个if块条件的true和相同方式的参数传递给ajax所有的ajax调用。
PHP代码
<?php
if($_POST['DATA']=='FIRST'){
all statements are here.
}else if($_POST['DATA']=='SECOND'){
all statements of second block is here.
}else if($_POST['DATA']=='THIRD'){
all statements of the third block are here.
} so on
?>
AJAX呼叫
// First AJAX CALL for FIRST IF BLOCK
$.ajax({
url: 'please give php file url',
data:{ DATA: 'FIRST' },
success: function(){
console.log('works');
}
});
// Second AJAX CALL for SECOND IF BLOCK
$.ajax({
url: 'please give php file url',
data:{ DATA: 'SECOND' },
success: function(){
console.log('works');
}
});
// so on
我认为,我在正确的轨道上:)
答案 1 :(得分:0)
但是这不算是不好的架构吗?不,按照您的方式来做将是糟糕的体系结构。在不同文件中进行单独操作(delete.php,update.php,create.php)会更好,更易于维护,但是我在谈论php部分,是的,您可以在同一JavaScript上对这些文件的所有调用 例如:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class=selector>
<li><a class="active" href="https://www.youtube.com/embed/aBihWjWQdvA" target="test" onclick="document.getElementById('test').frameBorder=1"> 1 </a></li>
<li><a href="https://www.youtube.com/embed/aBihWjWQxvd" target="test" onclick="document.getElementById('test').frameBorder=1"> 2 </a></li>
</div>
<div style="position:relative;padding-top:56.25%;">
<iframe src="https://www.youtube.com/embed/aBihWjWQxvA" frameborder="0" name="test" id="test" allowfullscreen style="position:absolute;top:0;left:0;width:90%;height:90%;"></iframe>
</div>