更新了@RoyalBG
按钮:
<button id="btn1" class="btn btn-default myButton" type="button" value="1">Auto</button>
<button id="btn2" class="btn btn-default myButton" type="button" value="2">Easy</button>
的Ajax:
$(function(){
$(document).on("click",".myButton",function() {
var value = $(this).val();
$.ajax( {
type: 'get',
url: "auto.php",
data: {
auto_value : value
}
success: function (response) {
$("#auto_content").html(response);
}
});
});
});
auto.php:
<?php
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$auto_value = '1';
if (isset($_GET['auto_value'])) {
if ($_GET['auto_value'] == 1) {
$auto_value = 't.style = 0 and t.type = 0';
} else if ($_GET['auto_value'] == 2) {
$auto_value = 't.style = 1 and t.type = 0';
}
}
$sql = "SELECT m.MapName, SEC_TO_TIME(TRUNCATE(t.Time,3)) AS Time, p.User FROM times t INNER JOIN maps m ON t.MapID = m.MapID INNER JOIN players p ON p.PlayerID = t.PlayerID INNER JOIN (SELECT t.MapId, MIN(t.time) as time FROM times t WHERE ".$auto_value." GROUP BY t.MapId ) tmin ON tmin.MapId = t.MapId and tmin.time = t.time";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table class='table table-striped table-fixedheader sortable'><thead><tr><th data-defaultsort='asc'>Map</th><th>Time</th><th>Player</th></tr></thead><tbody style='height:300px' class='searchable'>";
// output data of each row
while($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["MapName"]."</td><td>".$row["Time"]."</td><td>".$row["User"]."</td></tr>";
}
echo "</tbody></table>";
} else {
echo "0 results";
}
$conn->close();
&GT;
包括:
<div id="auto_content">
<?php include 'auto.php'; ?>
</div>
单击按钮后,表格不会更改。我不确定我是否做错了。 此外,是否可以在include? p>之后加载脚本
答案 0 :(得分:3)
您的代码对于SQL注入非常容易受到攻击。
您正在将BUTTON VALUE直接传递给SQL语句,使用CLEAR IDEA OF ALTERING SQL语句,例如向WHERE子句添加内容。
如果我将按钮的值更改为某个1 OR 1 UNION ...
或任何其他会破坏默认行为的SQL代码,会发生什么。
我强烈建议您改变方法。例如,使用枚举。自动按钮将发送auto_value=1
,然后在您的代码中,您需要测试auto_value
并执行不同的SQL附加父项。
E.g:
$auto_value = '1';
if (isset($_GET['auto_value'])) {
if ($_GET['auto_value'] == 1) {
$auto_value = 't.style = 0 and t.type = 0';
}
}
$sql = "SELECT m.MapName, SEC_TO_TIME(TRUNCATE(t.Time,3)) AS Time, p.User FROM times t INNER JOIN maps m ON t.MapID = m.MapID INNER JOIN players p ON p.PlayerID = t.PlayerID INNER JOIN (SELECT t.MapId, MIN(t.time) as time FROM times t WHERE ".$auto_value." GROUP BY t.MapId ) tmin ON tmin.MapId = t.MapId and tmin.time = t.time";
这样,如果auto_value
未通过请求发送,您还将设置默认行为。默认行为是WHERE 1
,就像没有任何where子句一样,所以它会列出所有内容。
请注意,success
回调中没有任何内容,因此在演示层中,点击后会发生NOTHING。将调用auto.php
,执行SQL并在服务器端呈现HTML,但其响应永远不会被捕获并呈现给最终用户。
您可能在页面加载时包含auto.php
,但这就是HTTP协议的工作原理 - 一旦发布,它就是静态的。您的异步请求不会更改包含的auto.php
内容。您需要使用DOM才能更改页面视图。在您的success
承诺中,您可能希望使用auto.php
显示的内容填充HTML元素。
让我用一个简短的例子来解释。
您在页面x.php
。
它包含以下代码:
的index.php:
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<div id="auto_content">
<?php include 'auto.php'; ?>
</div>
<button id="btn1" class="myButton" type="button" value="1">Button one</button>
<button id="btn2" class="myButton" type="button" value="2">Button two</button>
<script>
$(function(){
$(document).on("click",".myButton",function() {
var value = $(this).val();
$.ajax( {
type: 'get',
url: "auto.php",
data: {
auto_value : value
},
success: function (response) {
}
});
});
});
auto.php:
<?php
$text = "default text";
if (isset($_GET)) {
if ($_GET['auto_value'] == 1) {
$text = "button 1 clicked";
} else if ($_GET['auto_value'] == 2) {
$text = "second button clicked";
}
}
?>
<h1><?= $text; ?></h1>
此页面在加载default text
标记中打印<h1>
。
当您点击Button one
或Button two
时,系统会向auto.php
发送请求,并会收到包含<h1>button 2 clicked</h1>
或<h1>second button clicked</h1>
的回复。它将通过HTTP发送,不会有任何改变。 auto.php
中包含的实际index.php
不会改变。
如果要在不重新加载页面的情况下更改演示文稿,则需要使用javascript来控制UI。您可能会发现我已将auto.php
包含在ID为auto_content
的div中。您需要做的是,在该div中加载auto.php
的响应,使其内容随着第一个按钮点击或第二个按钮而改变。
在您的成功回调中,您将在变量response
中以纯文本形式接收整个回复。
在这个简单的示例中,您只需将其作为HTML加载到div auto_content
。
所以你需要这个:
success: function (response) {
$("#auto_content").html(response);
}
答案 1 :(得分:0)
if(isset($_GET['auto_value'])) {
//Your code goes here
}else {
echo "Auto Value not received!";
}