【问题标题】:Change SQL statement upon change on seclection更改选择时更改 SQL 语句
【发布时间】:2016-10-16 08:49:49
【问题描述】:

我有两个divs

第一div

inputs 喜欢checkboxselect

<div>Events Selection</div>
Events <input type="checkbox" id="Option-1" checked="true">
Leaves <input type="checkbox" id="Option-2" checked="true">
Meetings <input type="checkbox" id="Option-3" checked="true">
Travels <input type="checkbox" id="Option-4" checked="true">

<div>Station Selection</div>           
<select id="Filters1">
<option value="0">All Stations</option>
<option value="1">Main Station</option>
<option value="2">Sub Station</option>
<option value="3">Sub Station Main Office</option>
</select>

第二个div

有一条 SQL 语句 $sql = "SELECT * FROM events";,我想回显来自 First div 的所有已检查和选择的选项。

所以,我的问题是当First div中的选择或复选框发生变化时如何动态更改SQL语句。

Like:页面加载时应该是这样的:

$sql = Select * From events Where (every checkboxes are 
checked and `All Stations` are selected.)

当用户想要过滤来自First div 的结果时,应将$sql 语句更改为用户选择并检查的内容。

喜欢:我想用Main Station 选择检查EventsMeetings 复选框,所以现在我希望$sql 语句应该更改为我在Second div 中的选择。

【问题讨论】:

  • 使用 ajax 发送帖子,然后你的 where 语句应该是 foreach post_name = post_value
  • 感谢您的评论,亲爱的@SamirNabil,但我运气不好 :) 因为我在第二学期,而不是这方面的专家。我可以从 MySQL 获取数据,但不能在更改时更改 $sql 语句,如果您指导我完成,我会很高兴。谢谢。

标签: javascript php jquery html sql-server


【解决方案1】:

首先使用参数化查询,不要动态构造它们。 MSDN上的例子和解释。

编写将接收所选选项的value 并为您提供所需数据的存储过程。 F.e.:

CREATE PROCEDURE dbo.getevents
    @value int
AS
SELECT * 
FROM events
WHERE somecolumn = @value

这是简化版,我猜你需要一些if 声明,比如IF @value = 0...SELECT this ... IF @value = 1

在这种情况下,您可以使用:

$sql = "EXEC dbo.getevents ?";
$stmt = sqlsrv_query($conn, $sql, array($value));

然后获取结果并将其显示在您的页面上。

编辑#1

使用 XAMP 和 SQL Server 2014

免责声明:我发布此代码仅用于演示目的。参数作为字符串传递,没有样式,可能有些错误。

我安装了 XAMP。已下载sqlsrv 库,在php.ini 中启用它们。

我获得了带有数据库Test 的本地 SQL Server。 SQL Server 有一个名为sqldev 的实例。我的电脑名称是workshop。所以,而不是SERVER\INSTANCE 应该是workshop\sqldev。而不是DATABASE - Test。这就是我写的连接。

一开始我是这样创建表的:

CREATE TABLE dummy (
    id int identity(1,1),
    [Desc] nvarchar(max),
    [Type] nvarchar(100)
)

INSERT INTO dummy VALUES
('Do something already','Events'),
('Congrats!','Events'),
('Meet up at six PM','Meetings'),
('To Amsterdam','Travels'),
('goodbye!','Leaves')

表格包含一些可以使用的虚拟数据。

下一步:

https://jquery.com/download/下载jQuery(我用的是jquery-3.1.1.js

index.php

<html>
<head>
    <script src="jquery-3.1.1.js"></script>
    <style>
        table {
            width:20%
        }
        table, td, th {
            border-collapse: collapse;
            border: 1px solid gray;
        }
    </style>
</head>
<body>
    <div>Events Selection</div>
    Events <input type="checkbox" id="option" class="options" name="options[]" value="Events"> 
    Leaves <input type="checkbox" id="option"  class="options" name="options[]" value="Leaves">
    Meetings <input type="checkbox" id="option" class="options" name="options[]" value="Meetings">
    Travels <input type="checkbox" id="option" class="options" name="options[]" value="Travels">
    <div id="response"></div>

    <script>

    $('input:checkbox').click(function() {

    $.ajax({
        url: "sql_page.php",
        type: "post",
        data: $('.options:checked').serialize(),
        success: function(data) {
        $('#response').html(data);
        }
    });

    });

    </script>
</body>
</html>

sql_page.php

<?php
header('Content-Type: text/html; charset=utf-8');
$serverName = "SERVER\INSTANCE";
$connectionInfo = array("Database"=>"DATABASE");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if(isset($_POST['options'])) {

    if( $conn === false ) {
        echo "Unable to connect.</br>";
        die( print_r( sqlsrv_errors(), true));
    }

    $values = $_POST['options'];
    $valuelist = "'" . implode("', '", $values) . "'";
    $tsql = "SELECT * FROM dummy WHERE [Type] IN (".$valuelist.");";

    $stmt = sqlsrv_query($conn, $tsql);

    if( $stmt === false ) {
        echo "Error in executing query.</br>";
        die( print_r( sqlsrv_errors(), true));
    }

    echo "<table>";
    while ($obj = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC)) {
    echo "<tr>
            <td>".$obj[0]."</td>
            <td>".$obj[1]."</td>
            <td>".$obj[2]."</td>
        </tr>\n";
    }
    echo "</table>";

    sqlsrv_free_stmt( $stmt);
    sqlsrv_close( $conn );
}
?>

然后我在浏览器中继续index.php

如果您使用的是 MySQL,则需要使用其他库和命令,但它们与我编写的类似。主要思想是连接到数据库并使用参数运行一些查询,这是一个sql_page.php 的想法。

单击复选框时,index.php 部分将 Ajax 请求发送到 sql_page.php。然后使用id=response 在div 中显示来自此页面的数据(从SQL Server 获得)。

编辑#2

使用 EasyPHP Devserver 16.1.1here下载

我在默认文件夹中安装了EasyPHP,启动它,转到http://127.0.0.1:1111,在端口8888 上启动Apache + PHP,启动MySQL。

我在其中创建了一个名为air-hr 的数据库和一个名为events 的表。下表的脚本和结构:

CREATE TABLE `events` (
  `eventid` int(11) NOT NULL,
  `eventname` varchar(100) NOT NULL,
  `eventcategory` varchar(100) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `events` (`eventid`, `eventname`, `eventcategory`) VALUES
(1, 'Go now!', 'Leaves'),
(2, 'Meet some new people', 'Meetings'),
(3, 'Travel to Amsterdam', 'Travels'),
(4, 'PARTY HARD!', 'Events');

我还创建了用户test,它可以连接到数据库并从表中选择。

我在C:\Program Files (x86)\EasyPHP-Devserver-16.1\eds-www项目文件夹中创建了2个文件(它们的描述如下)并复制jquery-3.1.1.js

index.php 和上面一样

sql_page.php

<?php
header('Content-Type: text/html; charset=utf-8');

if(isset($_POST['options'])) {

    $values = $_POST['options'];
    $valuelist = "'" . implode("', '", $values) . "'";
    $query = "SELECT * FROM events WHERE eventcategory IN (".$valuelist.");";

    $link = mysqli_connect("localhost", "test", "testpass", "air-hr");
    if (!$link) {
        echo "Error: Unable to connect to MySQL." . PHP_EOL;
        echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }

    echo "<table>";
    if ($result = mysqli_query($link, $query)) {
        while ($row = mysqli_fetch_row($result)) {
            echo "<tr>
                <td>".$row[0]."</td>
                <td>".$row[1]."</td>
                <td>".$row[2]."</td>
            </tr>\n";
        }
        mysqli_free_result($result);
    }
    echo "</table>";

    mysqli_close($link);
}

?>

结果如下:

希望对您有所帮助!

【讨论】:

  • 非常感谢,不过我现在是第二学期,所以有点难搞定。你能解释一下如何,有点。我的意思是我有表格和div。我如何才能真正连接过滤器和$sql 声明。
  • 我有一个与$conn 连接的数据库,它适用于静态$sql 语句,但不适用于像问题一样的动态$sql 语句。
  • 非常感谢@gofr1,我会很高兴的。 :)
  • 感谢您的回答,但我尝试了两个小时来弄清楚为什么它对我不起作用,但我仍然不知道。我没弄明白主机、数据库名、表名在哪里,如果你坐在那它在哪里,因为它不起作用.......
  • 我已经使用$conn 为我的数据库分配了一个连接,它工作正常。告诉我如何从air-hr 数据库和events 表中获取数据。
【解决方案2】:

这里是代码

首先命名您的输入并选择如下:

<form action="sql_page.php" method="post">
 <div>Events Selection</div>
   Events <input type="checkbox" id="Option-1" name="Option-1" checked="true">
   Leaves <input type="checkbox" id="Option-2" name="Option-2" checked="true">
   Meetings <input type="checkbox" id="Option-3" name="Option-3" checked="true">
   Travels <input type="checkbox" id="Option-4" name="Option-4" checked="true">

 <div>Station Selection</div>           
  <select id="Filters1" name="Filters1">
  <option value="0">All Stations</option>
  <option value="1">Main Station</option>
  <option value="2">Sub Station</option>
  <option value="3">Sub Station Main Office</option>
  </select>
  <input type="submit" id="submit">
</form>

在你的 sql_page.php 中这里是 php 代码

if (isset($_POST)) {
foreach ($_POST as $col => $value) {

    $whare .= "$col = '$value' AND ";
}
$whare = rtrim($whare,'AND ');


$sql = "Select * From events Where $whare";


}

【讨论】:

  • 谢谢@Samir。我有错误Undefined variable: whare
  • 在 foreach $where = '' 之前添加,但是给出正确的 sql 语句?
  • 抱歉,我没收到。你能在你的答案中解决它吗?谢谢。
  • if (isset($_POST)) { $where=''; foreach ($_POST as $col =&gt; $value) { $whare .= "$col = '$value' AND "; } $whare = rtrim($whare,'AND '); $sql = "Select * From events Where $whare"; }
  • 再次Undefined variable: whare
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2010-09-13
相关资源
最近更新 更多