按钮单击时使用ajax更改SQL查询的问题

时间:2015-01-05 08:12:37

标签: php mysql ajax

更新了@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?之后加载脚本

2 个答案:

答案 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 oneButton 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!";

}