如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果

Posted

技术标签:

【中文标题】如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果【英文标题】:how to perform sql command on html page with user input field, and show result on the same page 【发布时间】:2011-10-17 15:12:56 【问题描述】:

我写了一个命令,或者我从用户输入字段中填写了参数值。单击按钮,将此命令发送到 php 并将结果值发送回 html 以显示。 例如。在 html 页面上:

select ___ from ____, 

我用“tablenameone”和“valueone”填充了两个可用的输入字段。然后,结果将打印在同一页面的 html 文本字段中。

我所知道的是这些值可以以这种格式发送(也许)

$('input[name="talbename"]') 
$('input[name="value"]')
example.com?tablename=tablenameone&value=valueone

我在 php 方面使用

 $sql="SELECT '$_GET['value']' FROM '$_GET['tablename']';

我不知道的是......我应该如何在点击功能中执行此操作?它肯定使用ajax。但我怎样才能产生 example.com?tablename=tablenameone&value=valueone 我应该把 $('input[name="value"]')

在此先感谢 :D

【问题讨论】:

很好的SQL injection hole 在 PHP 语法错误之上... 完全同意 Marc B,巨大的安全漏洞! 所以你让用户决定选择哪个字段,在哪里做,而不是清理?我不知道你的数据库能用多久 guys..lol 来自你的链接 marc B 的好笑话....我只是简化了我的问题,所以我可以从基本开始....我实际上计划使用选择来代替... ***.com/questions/7794055/… 这是我最初的问题...花了一些时间来解释我的实际问题.. 【参考方案1】:

您不得在查询中使用直接输入,因为您将对SQL injection attacks 开放。

$sql="SELECT '$_GET['value']' FROM '$_GET['tablename']';

改为使用以下内容:

$column = $_GET['value'];
$table = $_GET['tablename'];
$sql = sprintf("SELECT %s FROM %s;",
             mysql_real_escape_string($column),
             mysql_real_escape_string($table));

尽管通过向人们提供一个告诉他们所有表名和列名的页面,您仍然暴露了太多“内部信息”!

不管怎样,这里有一个完整的例子;

<form method="post" action="">
    <fieldset>
        <legend>Select Data</legend>
        <p><label>Table<br>
        <select name="table">
            <option value="tblStudents">Students</option>
        </select></label></p>
        <p><label>Table<br>
        <select name="column">
            <option value="firstname">First Name</option>
            <option value="lastname">Last Name</option>
        </select></label></p>
        <p><input type="submit" name="submit" value="submit">
    </fieldset>
</form>
<?php
$connection = mysql_connect("servername:3306", "user", "password") or die ('Error connecting to mysql');

mysql_select_db("databasename");  

$column = mysql_real_escape_string($_POST['column']);
$table =  mysql_real_escape_string($_POST['table']);
$sql = sprintf("SELECT %s FROM %s;",
        $column,
        $table);

$result = mysql_query($sql) or die(mysql_error());

echo '<ul>';
while($row = mysql_fetch_array($result))  
    echo '<li>' . $row[$column] . '</li>';

echo '</ul>';

mysql_close($connection); 
?>

【讨论】:

【参考方案2】:

似乎没有人真正回答过这个问题(虽然它们都是好点,但我会假设你这样做是有原因的),我会回答:

$('form[name=formname]').submit(function(e)
    e.preventDefault;
    var tablename = $('input[name="tablename"]').val();
    var value = $('input[name="value"]').val();
    $.get("example.php?tablename="+tablename+"&value="+value, function(data)
         $('body div').text(data);
    )
);

PHP:

$sql=mysql_query("SELECT '$_GET['value']' FROM '$_GET['tablename']'")or die(mysql_error());
$sqlOutput = mysql_fetch_array($sql);
echo "<pre>";
print_r($sqlOutput);
echo "</pre>";

显然将formname 替换为您的表单名称,将body div 替换为您希望输出进入的元素的名称,并在合适的地方替换所有其他标识符。然后更改 PHP 中的输出以满足您的需要。

再次,请记住有关 SQLi 的帖子,因为您自己有一个非常严重的问题。

【讨论】:

我可以使用 $("input.classname").click(function (e) 代替吗? preventDefault 是为了不去 php 页面,不是吗?:D 当然,但是如果submit 上的e.preventDefault 会正常工作,因为它会阻止表单实际提交,然后处理所有AJAX【参考方案3】:

您确实想确保您不会对 SQL 注入持开放态度。

你可以使用mysql准备好的语句

使用php函数mysql_real_escape_string($_GET['value'])

阅读此主题: How can I prevent SQL injection in PHP?

我不确定你所说的点击功能是什么意思。

【讨论】:

以上是关于如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果的主要内容,如果未能解决你的问题,请参考以下文章

html怎么获取动态数据?

html怎么获取动态数据?

如何使用自动填充html列表为用户创建搜索字段

如何在颤动中显示带有提交按钮和隐藏输入字段的html表单

如何从 Django 页面的文本字段中获取输入,然后使用响应更新 SQL 表?

如何防范SQL注入?