您的位置 首页 php

数据库简单使用语句(十四)最后一堂MySQL

2017.12.29,工作日的最后一天,下次上班就是2018年了,可以把今天当做2017年工作日的最后一天,同时我们的 MySQL 今天学习也是最后一堂了,三个内容:MYSQL及 sql注入 、MYSQL导出数据、MYSQL导入数据。更新MYSQL已经大致更新了2周~3周了,阅读的头条用户虽然没有多少,但是依然欣慰有一小部分人关注我和收藏我的文章,非常感谢您们,2018年工作日开始,我会继续更新其他技术知识,让我们一起去自学这些内容,希望大家一路既往的给予我支持,同时也希望有更多的人能够看到我更新的文字,期望我能早日转正,通过头条的新手期,这样我就能提高每日发文量了,现在被限制到每天1篇的发文,着实令我不够用啊,希望看到的朋友多多关注我,收藏我,转发我的文章,让更喜欢学习的人看到我的文章,感谢头条的每一位人,期待你们每一位在2017都是有收获的,即使一无所获的人们,你们一样也会有收获的,比如:收获个毛,收获个鸟,收获个蛋啊, 这些都是收获。呵呵,开个玩笑。 无论2017年你们有过什么样的经历,好的,坏的,痛苦的,快乐的。都已经过去了,让我们在2018年,继续努力,成功者更上一层楼,失败者,纠正错误,达到成功。

接下来我们继续学习MYSQL的内容:

MySQL 及 SQL 注入

如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。

我们简单说明如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询 字符串 ,最终达到欺骗服务器执行恶意的SQL命令。

我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:

if (preg_match(“/^\w{8,20}$/”, $_GET[‘username’], $matches))

{

$result = mysql i_query($conn, “SELECT * FROM users

WHERE username=$matches[0]”);

}

else

{

echo “username 输入异常”;

}

让我们看下在没有过滤特殊字符时,出现的SQL情况

// 设定$name 中插入了我们不需要的SQL语句

$name = “Qadir’; DELETE FROM users;”;

mysqli_query($conn, “SELECT * FROM users WHERE name='{$name}'”);

以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的SQL语句,将删除 users 表中的所有数据。

在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以我们对这些用户的数据需要进行严格的验证。

防止SQL注入,我们需要注意以下几个要点:

  • 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双”-“进行转换等。

  • 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

  • 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

  • 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

  • 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

  • 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

防止SQL注入

在脚本语言,如Perl和PHP你可以对用户输入的数据进行转义从而来防止SQL注入。

PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。

if (get_magic_quotes_gpc())

{

$name = stripslashes($name);

}

$name = mysqli_real_escape_string($conn, $name);

mysqli_query($conn, “SELECT * FROM users WHERE name='{$name}'”);

Like语句中的注入

like查询时,如果用户输入的值有”_”和”%”,则会出现这种情况:用户本来只是想查询”abcd_”,查询结果中却有”abcd_”、”abcde”、”abcdf”等等;用户要查询”30%”(注:百分之三十)时也会出现问题。

在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:

$sub = addcslashes(mysqli_real_escape_string($conn, “%something_”), “%_”);

// $sub == \%something\_

mysqli_query($conn, “SELECT * FROM messages WHERE subject LIKE ‘{$sub}%'”);

addcslashes()

函数在指定的字符前添加反斜杠。

语法格式:

addcslashes(string,characters) 
参数 描述
string 必需。规定要检查的字符串。
characters 可选。规定受 addcslashes() 影响的字符或字符范围

MySQL 导出数据

MySQL中你可以使用 SELECT…INTO OUTFILE 语句来简单的导出数据到文本文件上。

使用 SELECT … INTO OUTFILE 语句导出数据

以下实例中我们将数据表 jrtt_table 数据导出到D:\jrtt_table.txt文件中:

select * from jrtt_table

into outfile ‘D:\jrtt_table.txt’;

执行完上面的命令,就可以在d盘中找到我们导出的数据了

如下生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。

SELECT * FROM jrtt_table INTO OUTFILE ‘/tmp/tutorials.txt’

character set gbk

FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘”‘

LINES TERMINATED BY ‘\r\n’;

SELECT … INTO OUTFILE 语句有以下属性:

  • LOAD DATA INFILE是SELECT … INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT … INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。

  • SELECT…INTO OUTFILE ‘file_name’形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。

  • 输出不能是一个已存在的文件。防止文件数据被篡改。

  • 你需要有一个登陆服务器的账号来检索文件。否则 SELECT … INTO OUTFILE 不会起任何作用。

  • UNIX 中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。

导出表作为原始数据

mysqldump 是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。

使用mysqldump导出数据需要使用 –tab 选项来指定导出文件指定的目录,该目标必须是可写的。

以下实例将数据表 runoob_tbl 导出到 /tmp 目录中:

mysqldump -uroot -p123456 –no-create-info –tab=d:\ jrttdb jrtt_table

导出SQL格式的数据

导出SQL格式的数据到指定文件,如下所示:

mysql dump -uroot -p123456 jrttdb jrtt_table > d:\jrtt_table_data.txt

打开生成的内容如下:

如果你需要导出整个数据库的数据,可以使用以下命令:

$ mysqldump -u root -p RUNOOB > database_dump.txt

password ******

如果需要备份所有数据库,可以使用以下命令:

$ mysqldump -u root -p –all-databases > database_dump.txt

password ******

–all-databases 选项在 MySQL 3.23.12 及以后版本加入。

该方法可用于实现数据库的备份策略。

将数据表及数据库拷贝至其他主机

如果你需要将数据拷贝至其他的 MySQL 服务器上, 你可以在 mysqldump 命令中指定数据库名及数据表。

在源主机上执行以下命令,将数据备份至 dump.txt 文件中:

$ mysqldump -u root -p database_name table_name > dump.txt
password ***** 

如果完整备份数据库,则无需使用特定的表名称。

如果你需要将备份的数据库导入到MySQL服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:

$ mysql -u root -p database_name < dump.txt

password *****

你也可以使用以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:</p>

$ mysqldump -u root -p database_name \

| mysql -h other-host.com database_name

以上命令中使用了管道来将导出的数据导入到指定的远程主机上。

MySQL 导入数据

MySQL中可以使用两种简单的方式来导入MySQL导出的数据。


使用 LOAD DATA 导入数据

MySQL 中提供了LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl; 

如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。

你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。

两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。

如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。

mysql> LOAD DATA LOCAL INFILE ‘dump.txt’ INTO TABLE mytbl

-> FIELDS TERMINATED BY ‘:’

-> LINES TERMINATED BY ‘\r\n’;

LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

mysql> LOAD DATA LOCAL INFILE ‘dump.txt’

-> INTO TABLE mytbl (b, c, a);

使用 mysqlimport 导入数据

mysqlimport客户端提供了LOAD DATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。

从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以使用以下命令:

$ mysqlimport -u root -p –local database_name dump.txt

password *****

mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

$ mysqlimport -u root -p –local –fields-terminated-by=”:” \

–lines-terminated-by=”\r\n” database_name dump.txt

password *****

mysqlimport 语句中使用 –columns 选项来设置列的顺序:

$ mysqlimport -u root -p –local –columns=b,c,a \

database_name dump.txt

password *****

mysqlimport的常用选项介绍

选项 功能
-d or –delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or –force 不管是否遇到错误,mysqlimport将强制继续插入数据
-i or –ignore mysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。
–fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。
–fields-terminated- by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。 默认的分隔符是跳格符(Tab)
–lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。

mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。

2017.12.29

头条新手:不懂世事的庸人

2018年继续更新其他技术学习的内容,喜欢就关注我吧。

文章来源:智云一二三科技

文章标题:数据库简单使用语句(十四)最后一堂MySQL

文章地址:https://www.zhihuclub.com/78669.shtml

关于作者: 智云科技

热门文章

网站地图