我正在研究类似SQL Developer的应用程序,其中用户输入一些SQL命令,服务器的结果显示在网页上的<div>
中。
问题是用户可以输入ANY字符串,无论是否输入有效的SQL,例如,如果用户发送select * from employees;
我想接收并显示在
<div>
文本完全如下:
+---------+----------+---------------+----------+
| user_id | username | full_name | password |
+---------+----------+---------------+----------+
| 1 | john | John Doe | admin |
当他输入错误的SQL字符串时,<div>
消息应该是标准的MySQL错误字符串,例如:
mysql> select * from usrsss;
ERROR 1146 (42S02): Table 'mydb.usrsss' doesn't exist
我知道安全风险,目前我不在乎。
能做到这一点,因为我无法控制用户发送的SQL字符串语法吗?
答案 0 :(得分:1)
首先,您在mysql>
处看到的提示代表 MySQL Shell 。这不是SQL或JDBC,而是MySQL提供的命令行界面。
此MySQL Shell允许您执行:
要使用的JDBC API将允许您运行第一组语句-SQL语句。不幸的是,它不允许您运行第二个程序,因此您对此不走运。
此外,对于第一组,JDBC API将提供与使用MySQL Shell时看到的错误代码和错误消息不完全相同的消息。
最重要的是,您可以模拟其中一些命令,但是体验可能并不完全相同。
但是...这是一个很大的问题,为什么首先要这样做?我的一位开发人员问我是否可以这样做,因为这并不难实现。这样,我们可以轻松地从网页上运行任何SQL命令。大?好吧这是巨大的安全风险。如果有人入侵您的网页,您将暴露整个数据库。
换句话说,不要将此代码部署到生产环境中。
答案 1 :(得分:1)
如果您使用的是java.sql.Connection
,
.createStatement()
创建一条语句。.executeQuery()
进行搜索.executeUpdate()
用于插入,更新和删除搜索时,确定要创建表的列数。
ResultSet rs = statement.executeQuery(String sql);
ResultSetMetaData metaData = rs.getMetaData();
在ResultSetMetaData
中,
.getColumnCount()
将为您提供列数。.getColumnName(int index)
将为您提供列名。创建表后,迭代ResultSet
,
while (rs.next()) {
rs.getString(int columnIndex);
}
使用上述方法获取值,然后向表中添加行。
别忘了用
包围代码块try{
} catch(Exception e){
e.getMessage();
}
因此,如果出现任何问题,可以抛出SQLException
。这将包括一条消息,指出错误的可能原因。
努力出路,尽情享受吧!