同一文件上有多个ajax调用以在同一文件中执行不同的代码?

时间:2018-09-28 21:29:04

标签: javascript php ajax pdo

我对服务器端脚本和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">&times;</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?

2 个答案:

答案 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>