跳至工具栏

Python3 MySQL 数据库连接

Python3 MySQL 数据库连接

本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查。

什么是 PyMySQL?

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。


PyMySQL 安装

在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装。

PyMySQL 下载地址:https://github.com/PyMySQL/PyMySQL。

如果还未安装,我们可以使用以下命令安装最新版的 PyMySQL:

$ pip install PyMySQL 

如果你的系统不支持 pip 命令,可以使用以下方式安装:

1、使用 git 命令下载安装包安装(你也可以手动下载):

$ git clone https://github.com/PyMySQL/PyMySQL $ cd PyMySQL/ $ python3 setup.py
 install 

2、如果需要制定版本号,可以使用 curl 命令来安装:

$
# X.X 为 PyMySQL 的版本号 $ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL* $ python3 setup.py
 install $
# 现在你可以删除 PyMySQL* 目录 

注意:请确保您有root权限来安装上述模块。

|

安装的过程中可能会出现"ImportError: No module named setuptools"的错误提示,意思是你没有安装setuptools,你可以访问https://pypi.py thon.org/pypi/setuptools 找到各个系统的安装方法。

Linux 系统安装实例:

$ wget https://bootstrap.py
pa.io/ez_setup.py
 $ python3 ez_setup.py
 

|


数据库连接

连接数据库前,请先确认以下事项:

  • 您已经创建了数据库 TESTDB.
  • 在TESTDB数据库中您已经创建了表 EMPLOYEE
  • EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
  • 连接数据库TESTDB使用的用户名为 “testuser” ,密码为 “test123”,你可以可以自己设定或者直接使用root用户名及其密码,Mysql数据库用户授权请使用Grant命令。
  • 在你的机子上已经安装了 Python MySQLdb 模块。
  • 如果您对sql语句不熟悉,可以访问我们的 SQL教程

实例:

以下实例链接Mysql的TESTDB数据库:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() 
# 使用 execute()  方法执行 SQL 查询  cursor.execute("SELECT VERSION()") 
# 使用 fetchone() 方法获取单条数据. data = cursor.fetchone()  
print ("Database version : %s " % data) 
# 关闭数据库连接 db.close() 

执行以上脚本输出结果如下:

Database version : 5.5.20-log 

创建数据库表

如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() 
# 使用 execute() 方法执行 SQL,如果表存在则删除 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") 
# 使用预处理语句创建表 sql = """CREATE TABLE EMPLOYEE (
 
    FIRST_NAME  CHAR(20) NOT NULL,
 
    LAST_NAME  CHAR(20),
 
    AGE INT,
 
  SEX CHAR(1),
 
    INCOME FLOAT )"""  cursor.execute(sql) 
# 关闭数据库连接 db.close() 

数据库插入操作

以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用cursor()方法获取操作游标  cursor = db.cursor() 
# SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
 
    LAST_NAME, AGE, SEX, INCOME)
 
    VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try:
   
# 执行sql语句
    cursor.execute(sql)
   
# 提交到数据库执行
    db.commit() except:
   
# 如果发生错误则回滚
    db.rollback() 
# 关闭数据库连接 db.close() 

以上例子也可以写成如下形式:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用cursor()方法获取操作游标  cursor = db.cursor() 
# SQL 插入语句 sql = "INSERT INTO EMPLOYEE(FIRST_NAME,
 
   LAST_NAME, AGE, SEX, INCOME)
 
   VALUES ('%s', '%s', '%d', '%c', '%d' )" %
 
   ('Mac', 'Mohan', 20, 'M', 2000) try:
   
# 执行sql语句
    cursor.execute(sql)
   
# 执行sql语句
    db.commit() except:
   
# 发生错误时回滚
    db.rollback() 
# 关闭数据库连接 db.close() 

以下代码使用变量向SQL语句中传递参数:

.................................. user_id = "test123" password = "password"  con.execute('insert into Login values("%s", "%s")' %
 
     (user_id, password)) .................................. 

数据库查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall(): 接收全部的返回结果行.
  • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

实例:

查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用cursor()方法获取操作游标  cursor = db.cursor() 
# SQL 查询语句 sql = "SELECT * FROM EMPLOYEE
 
   WHERE INCOME >'%d'" % (1000) try:
   
# 执行SQL语句
    cursor.execute(sql)
   
# 获取所有记录列表
    results = cursor.fetchall()
    for row in results:
       fname = row[0]
       lname = row[1]
       age = row[2]
       sex = row[3]
       income = row[4]
 
 
# 打印结果
       
print ("fname=%s,lname=%s,age=%d,sex=%s,income=%d" %
 
     (fname, lname, age, sex, income )) except:
    
print ("Error: unable to fecth data") 
# 关闭数据库连接 db.close() 

以上脚本执行结果如下:

fname=Mac, lname=Mohan, age=20, sex=M, income=2000 

数据库更新操作

更新操作用于更新数据表的的数据,以下实例将 TESTDB表中的 SEX 字段全部修改为 ‘M’,AGE 字段递增1:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用cursor()方法获取操作游标  cursor = db.cursor() 
# SQL 更新语句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
 


     WHERE SEX = '%c'" % ('M') try:
   
# 执行SQL语句
    cursor.execute(sql)
   
# 提交到数据库执行
    db.commit() except:
   
# 发生错误时回滚
    db.rollback() 
# 关闭数据库连接 db.close() 

删除操作

删除操作用于删除数据表中的数据,以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:

#!/usr/bin/python3
import pymysql 
# 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) 
# 使用cursor()方法获取操作游标  cursor = db.cursor() 
# SQL 删除语句 sql = "DELETE FROM EMPLOYEE WHERE AGE >'%d'" % (20) try:
   
# 执行SQL语句
    cursor.execute(sql)
   
# 提交修改
    db.commit() except:
   
# 发生错误时回滚
    db.rollback() 
# 关闭连接 db.close() 

执行事务

事务机制可以确保数据一致性。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

  • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。

实例


# SQL删除记录语句 sql = "DELETE FROM EMPLOYEE WHERE AGE >'%d'" % (20) try:
   
# 执行SQL语句
    cursor.execute(sql)
   
# 向数据库提交
    db.commit() except:
   
# 发生错误时回滚
    db.rollback() 

对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。

commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。


错误处理

DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:

异常 描述
Warning 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error 警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
DatabaseError 和数据库有关的错误发生时触发。 必须是Error的子类。
DataError 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。
OperationalError 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。
IntegrityError 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
InternalError 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。
ProgrammingError 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。
NotSupportedError 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。

第十九回、PHP基础教程,PHP源程序及MYSQL数据库的上传

PHP网站及本地测试的MYSQL数据库设置好之后,就可以申请虚拟空间了,当虚拟空间申请成功之后,可以使用如FlashFXP之类的FTP上传工具将PHP源代码及MYSQL数据库上传至虚拟空间。

至于PHP源代码的上传比较简单,直接上传其文件及文件的所在的文件夹即可,但MYSQL数据库的上传就要有一定的说法了。MYSQL数据库的上传方式法有多种,本教程将其中的一中比较简单的方法介绍之——用phpmyadmin来实现。

其操作步骤如下:

一、如果空间提供商提供的phpmyadmin,那么,你应先向空间提供商索要phpmyadmin的登录地址、用户名和密码——用户名和密码一般是你在空间商那里申请的用户名和密码。如果空间商没有提供phpmyadmin,那么,你就应该先将你本地的phpmyadmin上传至空间中——最好是将phpmyadmin保存在空间中新建的一个专用文件夹,然后配置phpmyadmin——前面已经介绍过了,这里略。

二、在本地作如下操作。用phpmyadmin将你当前网站用到的MYSQL数据库“导出”——在phpmyadmin的界面里有一“导出”项供你导出数据库使用,在导出时,选择导出的文件类型为SQL类型,并选中“另存为文件”选项,并给这个文件起上名字,其它可以使用默认设置,点击“执行”按钮进行导出操作。导出成功后,会弹出一个“另存为”对话框来保存这个导出的SQL文件,选择保存的位置之后,点保存即可。至此,MYSQL数据库的导出操作完成。

三、在浏览器中打开你空间中的phpmyadmin主页,输入正确的用户名和密码后即可登录到phpmyadmin的主页。在主页中有一项命令“import”或“导入”,它的功能就是将外部的数据库文件导入到MYSQL数据库管理系统中。点击之后,在进入的页面中有一项“文本文件的位置”,在其右侧是一个文件路径输入框,点“浏览”按钮,在本地找到刚才导出的扩展名是.sql的SQL文本文件,点击“打开”,点击“执行”。至此,本地的数据库已经成功导入到远程空间服务器的MYSQL数据库管理系统中,数据库上传成功。

打开你的网站主页,看一看你炫目的网站吧!

第十八回、PHP基础教程,MYSQL数据类型

MySQL 支持大量的列类型,它们可以被分为 3 类:数字类型、日期和时间类型以及字符串(字符)类型。这个章节首先给出可用类型的概述,并且总结各类型所需的存储需求,然后提供各类型中的类型范畴更详细的描述。概述有意地简化了。更详细的说明应该参考特写列类型的附加信息,例如你能为其指定值的允许格式。

MySQL 支持的列类型在下面列出。下列代码字母用于描述中:

M指出最大的显示尺寸。最大的显示尺寸长度为 255。

D 适用于浮点类型。指出跟随在十进制小数点后的数字数量。最大可能值为 30,但不应大于M-2。

方括号 (“[”and“]”) 指定可选的类型修饰部份。

注意,如果为一个列指定了ZEROFILL,MySQL 将自动为这个列添加UNSIGNED属性。

警告:你应该知道当在两个整数类型值中使用减法时,如有一个为UNSIGNED类型,那么结果也是无符号的。查看章节6.3.5 Cast 函数。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

-128到127。无符号的范围是0到255。

BIT,BOOL它们是TINYINT(1)的同义词。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

一个小整数。有符号的范围是-32768到32767。无符号的范围是0到65535。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

一个中等大小的整数。有符号的范围是-8388608到8388607。无符号的范围是0到16777215。

INT[(M)] [UNSIGNED] [ZEROFILL]

一个正常大小的整数。有符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]

INT的同义词。

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

一个大的整数。有符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

BIGINT是用DOUBLE值来记录的,因此不能使用大于9223372036854775807(63 bits) 的无符号大整数,除了位函数之外!如果你这样做了,结果中的某些大数字可能会出错,因为将BIGINT转换成DOUBLE时产生了舍入错误。MySQL 4.0 在下列情况下可以处理BIGINT:

在一个BIGINT列中使用整数存储一个大的无符号值。

在MIN(big_int_column)和MAX(big_int_column)中。

当两个操作数都是整数时使用操作符 (+、-、*、等)。

通常你可以在一个BIGINT列中以字符串方式存储的一个精确的整数。在这种情况下,MySQL 将执行一个字符串到数字的转换,包括无 intermediate 的双精度表示法。

当两个参数均是整数值时,“-”、“+”和“*”将使用BIGINT运算!这就意味着,如果两个大整数的乘积(或函数的结果返回整数)的结果大于9223372036854775807时,你可能会得到意想不到的结果。

FLOAT(precision) [UNSIGNED] [ZEROFILL]

一个浮点型数字。precision可以是<=24作为一个单精度的浮点数字和介于 25 和 53 之间作为一个双精度的浮点数字。这些类型与下面描述的FLOAT和DOUBLE类型相似。FLOAT(X)有与相应的FLOAT和DOUBLE类型同样的范围,但是显示尺寸和十进制小数位数是未定义的。在 MySQL 3.23 中,它是一个真实的浮点值。而在 MySQL 早期的版本中,FLOAT(precision)通常有 2 小数位。 注意,由于在 MySQL 中所有的计算都是以双精度执行的,所以使用FLOAT可能带来一些意想不到的问题。查看章节A.5.6 解决没有匹配行的问题。

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

一个小的(单精度) 浮点数字。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。FLOAT没有参数或有X<= 24 的FLOAT(X)代表一个单精度的浮点数字。

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

一个正常大小的(双精度)浮上数字。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。DOUBLE没胡参数或有 25 <=X<= 53 的FLOAT(X)代表一个双精度的浮点数字。

DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL],REAL[(M,D)] [UNSIGNED] [ZEROFILL]

它们是DOUBLE同义词。

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

一个未压缩(unpacked)的浮点数。运作如同一个CHAR列:“unpacked” 意味着数字是以一个字符串存储的,值的每一位将使用一个字符。小数点并且对于负数,“-”符号不在M中计算(但是它们的空间是被保留的)。如果D是 0,值将没有小数点或小数部份。DECIMAL值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL列,实际的范围可以被所选择的M和D限制。如果UNSIGNED被指定,负值是不允许的。 如果D被忽略,缺省为 0。如果M被忽略,缺省为 10。 在 MySQL 3.23 以前,M参数必须包含符号与小数点所需的空间。

DEC[(M[,D])] [UNSIGNED] [ZEROFILL],NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]它们是DECIMAL的同义词。

DATE

一个日期。支持的范围是’1000-01-01’到’9999-12-31’。MySQL 以’YYYY-MM-DD’格式显示DATE值,但是允许你以字符串或数字给一个DATE列赋值。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。

DATETIME

一个日期和时间的组合。支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。MySQL 以’YYYY-MM-DD HH:MM:SS’格式显示DATETIME值,但是允许你以字符串或数字给一个DATETIME列赋值。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。

TIMESTAMP[(M)]

一个时间戳。范围是’1970-01-01 00:00:00’到2037年间的任意时刻。 MySQL 4.0 和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式显示的,它取决于M是否是14(或省略)、12、8或6,但是允许你以字符串或数字给一个TIMESTAMP列赋值。 从 MySQL 4.1 开始,TIMESTAMP以’YYYY-MM-DD HH:MM:DD’格式作为字符返回。如果你你希望以数字形式返回则必须在该时间戳字段后加上 +0。不同的时间戳长度是不支持的。从 MySQL 4.0.12 开始,选项–new可以被用来使服务器与 4.1 一样运作。TIMESTAMP列有益于记录一个INSERT或UPDATE操作的日期和时间,因为如果你自己没有给它赋值,它将被自动地设置为最近一次操作的日期和时间。也可以通过给它赋一个NULL而使它设置为当前的日期和时间。查看章节6.2.2 Date 和 Time 类型。 参数M只影响一个TIMESTAMP列的显示格式;它的值总是占用 4 个字节存储。 注意,当TIMESTAMP(M)列的M是 8 或 14 时,它返回的是数字而其它的TIMESTAMP(M)列返回的是字符串。这仅仅是为了可以可靠地转储并恢复到其它格式的表中。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。

TIME

一个时间。范围是’-838:59:59’到’838:59:59’。MySQL 以’HH:MM:SS’格式显示TIME值,但是允许你使用字符串或数字来给TIME列赋值。查看章节6.2.2.3TIME类型。

YEAR[(2|4)]

一个 2 或 4 位数字格式的年(缺省为 4 位)。允许的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。MySQL 以YYYY格式显示YEAR值,但是允许你使用字符串或数字来给YEAR列赋值。(YEAR类型在 MySQL 3.22 之前不支持。) 查看章节6.2.2.4YEAR类型。

[NATIONAL] CHAR(M) [BINARY]

一个定长的字符串,当存储时,总是以空格填满右边到指定的长度。M的范围是 0 到 255 (在 MySQL 3.23 版本之前为 1 到 255)。当该值被检索时,尾部空格将被删除。CHAR值根据缺省的字符集进行忽略大小写的排索与比较,除非指定了关键词BINARY。NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定义一个CHAR列,它将使用缺省的字符集。这在 MySQL 中是默认的。CHAR是CHARACTER的缩写。 MySQL 允许以CHAR(0)类型建立一个列。一些老程序运行时必需一个列,却又并不使用这个列的值,你就不得不为了适应它而建立该列,在这情况下,CHAR(0)将是很有益的。当需要一个列仅保存两个值时:一个为CHAR(0)(该列没有定义为NOT NULL),这将仅占用一个比特位来存储 2 个值:NULL或””。查看章节6.2.3.1CHAR和VARCHAR类型。

CHAR

这是CHAR(1)的同义词。

[NATIONAL] VARCHAR(M) [BINARY]

一个变长的字符串。注意:尾部的空格在存储时将会被删除(这与 ANSI SQL 约规不同)。M的范围是 0 到 255 (在 MySQL 4.0.2 之前的版本中是 1 到 255)。VARCHAR值以大小写忽略方式进行排索与比较,除非关键词BINARY被指定。查看章节6.5.3.1 隐式的列定义变化。VARCHAR是CHARACTER VARYING的缩写。查看章节6.2.3.1CHAR和VARCHAR类型。

TINYBLOB

TINYTEXT

一个BLOB或TEXT列,最大长度为 255 (2^8 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。

BLOB

TEXT

一个BLOB或TEXT列,最大长度为 65535 (2^16 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。

MEDIUMBLOB

MEDIUMTEXT

一个BLOB或TEXT列,最大长度为 16777215 (2^24 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。

LONGBLOB

LONGTEXT

一个BLOB或TEXT列,最大长度为 4294967295 (2^32 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。注意,由于服务器/客户端的协议以及 MyISAM 表通常有一个 16M 每通信包/表行的限制,你仍然不能使用这个类型的整个范围。查看章节6.2.3.2BLOB和TEXT类型。

ENUM(‘value1′,’value2’,…)

一个枚举类型。一个仅能有一个值的字符串对象,这个值选自值列’value1’、’value2’、…、NULL或特殊的””出错值。一个ENUM列可以有最大 65535 不同的值。查看章节6.2.3.3ENUM类型。

SET(‘value1′,’value2’,…)

一个集合。一个能有零个或更多个值的字符串对象,其中每个值必须选自值列’value1’、’value2’、…。一个SET列可以有最大 64 个成员。查看章节6.2.3.4SET类型。

MySQL 支持所有的 ANSI/ISO SQL92 数字类型。这些类型包括准确数字的数据类型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似数字的数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键词INT是INTEGER的同义词,关键词DEC是DECIMAL的同义词。

NUMERIC和DECIMAL类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;

例如:salary DECIMAL(5,2)在这个例子中,5(精度(precision)) 代表重要的十进制数字的数目,2(数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary列可以存储的值范围是从-99.99到99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到999.99,因为它没有存储正数的符号)。

总结:

整数型:TINYINT,SMALLINT,INT,BIGINT

小数型:FLOAT,DOUBLE,DECIMAL(M,D)

字符型:CHAR,VARCHAR

日期型:DATETIME ,DATE,TIMESTAMP

备注型:TINYTEXT ,TEXT ,LONGTEXT

第十七回、PHP基础教程,事件处理

事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

MYSQL的事务处理功能:

mySQL数据库从4.1版本开始支持事务处理功能。事务是DBMS得执行单位。它由有限得数据库操作序列组成的。但不是任意的数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)

原子性(Autmic):事务在执行时,要做到“要么不做,要么全做!”,就是说不允许事务部分的执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库的影响。

一致性(Consistency):事务的操作应该使使数据库从一个一致状态转变到另一个一致的状态!就拿网上购物来说吧,你只有既让商品出库,又让商品进入顾客的购物篮才能构成事务!

隔离性(Isolation):如果多个事务并发执行,应像各个事务独立执行一样!

持久性(Durability):一个成功执行的事务对数据库的作用是持久的,即使数据库因故障出错,也应该能够恢复!

MYSQL的事务处理主要有两种方法来实现。

1、用begin,rollback,commit来实现

begin 或 start transaction 开始一个事务

rollback 事务回滚(即取消所有对数据库的操作)

commit 事务确认(即执行对数据库的所有操作)

2、直接用set来改变mysql的自动提交模式

MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

set autocommit=0 禁止自动提交

set autocommit=1 开启自动提交

  来实现事务的处理。

但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了一个新的事务!按第一种方法只将当前的操作作为一个事务!我们推荐使用第一种方法。

PHP中实现数据库操作的事务功能范例:

<?php

…数据库连接…

mysql_query(‘BEGIN’);

//开启事务,也可以使用mysql_query(“START TRANSACTION”)开启事务

mysql_query(“SET AUTOCOMMIT=0”);

//设置事务不自动commit,用第二种形式时不加此语句

$sql =”一条SQL语句”;

Mysql_query($sql,$conn);

if(mysql_errno)

{

mysql_query(“ROLLBACK”);

exit;

}

$sql=”一条sql语句”;

mysql_query($sql);

if(mysql_errno)
{

print mysql_error();

mysql_query(‘ROLLBACK’);

//如果出错就回卷

exit();

}

else

{

mysql_query(“COMMIT”);

}

} //每执行一次SQL查询都要判断一次是否出错,如果出错则事务回滚,并exit;

终止程序执行。

mysql_query(‘COMMIT’);

//能够到这里,代表上述数据库操作都没有错,正式提交执行数据库操作

?>

还有就是注意要建立能用事务操作的表类型。以及除了commit外还有什么语句能结束一个事务。

第十六回、PHP基础教程,PHP与mySQL的连接

mySQL的连接

建议按以下将信息赋值给变量的形式,以后用到时,可以直接用变量。

$sqlServerName=”localhost/127.0.0.1/自己的IP地址”;

$userName=”登录数据库的用户名”;

$userPass=”登录数据库的密码”;

$sqlDataBase=”数据库的路径”;

$sql=”sql语句”;

//mySql数据库连接的语法:

$conn=mysql_connect($sqlServerName,$userName,$userPass);

mysql_select_db($sqlDataBase,$conn);

$queryResult=@ mysql_query($sql,$conn) or die(mysql_error());

$row=mysql_fetch_row($queryResult);

或$row=mysql_fetch_array($queryResult);

//说明:mysql_fetch_row($queryResult);

与mysql_fetch_array($queryResult);

的区别是,使用前者生成的数组$row只能使用下标来显示其每个元素的值——即每条记录中字段的值,而用后者则既可以用下标也可以使用数据表中的字段名来显示每个元素的值。

//下面是输出查询结果中每个字段的名称,按行输出

for($i=0;

$i<=mysql_num_fields($queryResult)-1;

$i++)

{

echo mysql_field_name($queryResult,$i).”&

nbsp;

&

nbsp”;

//输出查询结果中每个字段的名称

}

mysql_data_seek($queryResult,0);

//将记录指针移动到查询结果中指定的记录行上,行号从0开始,取值范围是0到(mysql_num_rows-1)

//下面是输出查询的每个记录

while($row=mysql_fetch_row($queryResult))//从结果集中取得一行作为枚举数组,返回根据所取得的行生成的数组,如果没有更多行则返回 FALSE。它会将记录指针自动移动到下一条

{

for($i=0;

$i<mysql_num_fields($queryResult);

$i++)

{

echo $row[$i].”&

nbsp;

&

nbsp;

“;

}

echo “<br>”;

}

mysql_free_result($queryResult);

//释放查询结果

PHP中有关数据查询的常用函数:

$myConnect=mysql_connect: 开启 MySQL 链接,建立PHP与MYSQL的连接

$mysql_select_db: 打开一个数据库,与MYSQL建立连接后,就可以打开一个数据库了

@ 和 or die(“错误信息”):在PHP中把@放在某语句的前面,就可以隐藏这条语句运行时出现的错误;把“or die”放在某条语句的后面,当这条语句在运行时出现错误时就可以显示指定的错误信息

说明:

mysql_connect(“主机”, “用户名”, “密码”) //说明:主机名可以是localhost或IP地址

mysql_select_db(“需打开的数据库名”,连接标识符);

mysql_query(“set names ‘GBK'”);

如果数据表中涵有中文,则在SQL查询前加入之可解决中文乱码

mysql_num_rows;

用于计算查询结果中所得行的数目

mysql_insert_id;

传回最后一次使用 INSERT 指令的 ID。

mysql_tablename;

取得数据库名称

mysql_error;

返回错误信息

mysql_free_result($queryResult);

//释放查询结果

mysql_clos;

关闭 MySQL 链接

htmlspecialchars(string,quotestyle,character-set);

// 主要功能是将HTML格式化,防止在输出html时被浏览器执行;string必要参数,指定需要解码的字符串对象;quotestyle可选参数,定义如何对单引号和双引号进行编码;character-set可选参数,指定使用什么样的字符串设置。详细说明见PHP5手册。

mysql_create_db(“webjx”);

//创建一个名称为webjx的新数据库

SQL语句中limit的用法(MYSQL的这个功能很好,可以比较容易的来实现分页操作):

Select * from table where 条件 limit 开始位置,操作记录数 //开始位置从0开始

Select * from table where 条件 limit 0,20//从满足条件的第1条记录开始,取20条满足条件的记录

Select * from table where 条件 limit 10,20//从满足条件的第11条刻录开始,取20条满足条件的记录

PHP无法向MYSQL保存中文文字或输出MYSQL中的中文文字出现乱码的解决:

PHP操作MYSQL,汉字出现乱码或无法将汉字插入到数据库中,究其原因是字符集设置不当。当数据库中的字符集采取的是UTF-8时,就在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码;对于GBK的数据库则使用SET NAMES GBK,示例代码如下:

$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);

mysql_query(“SET NAMES ‘GBK'”);

parse_url()解析URL函数:

parse_url() 是将URL解析成有固定键值的数组的函数

第十六回、PHP基础教程,PHP与mySQL的连接

PHP教程 环境配置

第一章 环境配置

说明:如果你使用的是安装版的php,且是win7以上的操作系统,可以省略IIS配置支持php、phpv5.1.2、ZendOptimizer的安装和调试。

系统配置

Windows7全新安装

效果目的

实现在用户本机环境下测试与调试Discuz!5.0等产品

适合用户

需要本地测试环境、程序、模板风格开发者、模板风格、插件MOD测试者

所需软件

IIS v5.1 – Windows7安装盘自带

MySql v5.0.27 – mysql-essential-5.0.27-win32.msi

PHP v5.1.2 – php-5.1.2-Win32.zip

ZendOptimizer v3.2.2 – ZendOptimizer-3.2.2-Windows-i386.exe

phpMyAdmin v2.9.2 – phpMyAdmin-2.9.2-all-languages.zip

安装步骤

1.1 本机创建目录

在本机D盘下创建Local文件夹,在该文件夹中创建MySQL、PHP5、Zend共三个文件夹,分别用于安装MySql v5.0.27、PHP v5.1.2、ZendOptimizer v3.2.2

1.2 安装IIS v5.1

1)在光驱中放入Windows7系统安装光盘

2)依次在”控制面板”-“添加与删除”-“添加/删除Windows组件”-“Windows组件向导”中选中”Internet信息服务(IIS)”

PHP教程 环境配置

3)点击”下一步”进行文件复制,直到完成安装

4)配置IIS web服务器。按下列步骤:控制面板&

rarr;

管理工具&

rarr;

Internet 信息服务;然后展开到”默认网站”,右键点击”默认网站”选择属性&

rarr;

输入本机IP地址(没有时就不要动它)&

rarr;

选择”主目录” &

rarr;

选择你在本机上的默认WEB目录&

rarr;

点”确定”。

1.3 安装MySql mysql-5.1.73

1)执行下载的mysql-essential-5.0.27-win32.msi

PHP教程 环境配置

2)按Next,然后选择Custom安装方式

PHP教程 环境配置

3)点击Change,改变安装路径;原路径是C:Program FilesMySQLMySQL Server 5.0,这里改为:D:LocalMySQL

PHP教程 环境配置

4)等安装进度条完成时,会出现Sign Up向导,选择最下面Skip Sign-Up,然后Next,上面有个”Configure the MySQL Server now”是打勾的,不要去掉,直接点Finish。

5)现在开始安装最后的配置,点Next,选择Detailed Configuration,然后选择第二个Server Machine

6)再Next,1专业数据库服务器,2专业事务处理数据库服务器,3测试用服务器(不支持事务处理)

PHP教程 环境配置

7)再Next,选择Manual Setting,连接数选择200到300,在此因为是本机测试,所以此项并不重要

PHP教程 环境配置

8)再Next,是设置其的端口,默认是3306,保留默认

PHP教程 环境配置

9)再Next,选择Manual Selected Default Character Set / Collation,在下面的 Character Set选择gbk

PHP教程 环境配置

10)再Next,在Include Bin Directory in Windows PATH前打勾

PHP教程 环境配置

11)再Next,在Modify Security Settings前的勾取消,因为是本地环境,非服务器和虚拟主机

PHP教程 环境配置

12)最后一个Next再加Execute,可以看到上面的步骤全部完成

PHP教程 环境配置

13)MySQL的帐号是:root,密码为空

PHP教程 环境配置

14)检测MySQL,键盘的Win + R,弹出运行对话框,输入cmd后回车,进入命令提示符,然后输入:”mysql -uroot &

ndash;

p”,回车后要求输入密码,因为密码为空,所以直接再按回车即可。现在可以看到如下成功的提示,表示全部安装成功

PHP教程 环境配置

PHP教程 环境配置PHP教程 环境配置

15)操作符变成了”mysql>”,键入exit退出即可

PHP教程 环境配置

1.4 安装PHP v5.1.2

1)将下载的php-5.1.2-Win32.zip解压缩到D:LocalPHP5目录中

2)将目录中的php.ini-dist(或php.ini-recommended,这个文件适合用在正式的服务器上,它的安全配置比php.ini-dist高)文件改名为php.ini

将php.ini与php5ts.dll两个文件移动到系统目录C:Windows中

将libmysql.dll复制到系统目录下C:Windows中

3)到系统目录C:Windows中找到php.ini文件,打开编辑如下

找到extension_dir = “./”这行,修改为extension_dir = ” D:LocalPHP5ext”

找到extension=php_mbstring.dll(宽字符支持,推荐选中)、extension=php_gd2.dll(PHP的GD库支持,必选)、extension=php_mysql.dll(使PHP支持MySQL,必选)这三行,然后将前面的;

去掉,使之支持相应功能

1.5 安装ZendOptimizer v3.2.2

1)执行下载的ZendOptimizer-3.2.2-Windows-i386.exe

2)按Next,路径选择界面,点Browse,默认是C:Program FilesZendZendOptimizer-3.2.2,将其修改为D:LocalZend

3)按Next后,服务器选择界面,此前刚成功安装IIS5.1,故选择”IIS”即第一个单选按钮,然后点Next

4)接下来的一路点Next,全使用默认的设置,然后Install,Zend安装完成

PHP教程 环境配置PHP教程 环境配置

1.6 配置IIS使之支持PHP

1)在”控制面板”&

rarr;

“管理工具”中找到并打开”Internet信息服务”

2)找到”网站” &

rarr;

“默认网站”,右键点击”默认网站”,然后点击”属性”

3)点击”ISAPI筛选器”,再点击”添加”按钮,在弹出的”筛选器属性”对话框中, “筛选器名称”填php,”可执行文件”填 D:LocalPHP5php5iaspi.dll,也可以按”浏览”按钮来选择,然后点击”确定”退出,注销或重新启动计算机。

如果前面设置正确的话,可发现在ISAPI筛选框中存在PHP这条筛选项,而且前面有个绿色的向上箭头,表示筛选已经起作用;如果是向下的红色箭头或者没有箭头的话,那表明前面的配置有问题,请重新检查设置

PHP教程 环境配置

4)点击”主目录”标签,再点击”配置”,出现”应用程序配置”对话框,再点击”添加”按钮,在弹出的”添加/编辑应用程序扩展名映射”对话框中,依次填入”可执行文件”: D:LocalPHP5php5iaspi.dll、”扩展名”:.php,如下图所示(其中php5isapi.dll的路径可以按”浏览”按钮来选择),其它配置按默认即可,然后点击”确定”退出。

PHP教程 环境配置PHP教程 环境配置

5)点击”文档”标签,再点”添加”按钮,在弹出的”添加默认文档”对话框中,填入:index.php,如下图所示,然后点击”确定”退出

PHP教程 环境配置

6)到此PHP Web服务器环境配置完成。

1.7 安装phpMyAdmin v2.9.2

1)将下载的phpMyAdmin-2.9.2-all-languages.zip解压缩到当前文件夹,更名为phpMyAdmin,然后移动到WWW根目录即C:Inetpubwwwroot目录下面

PHP教程 环境配置

2)编辑C:InetpubwwwrootphpMyAdminlibraries下的config.default.php

3)找到$cfg[‘Servers’][$i][‘auth_type’],这里表示进入使用phpMyAdmin的三种认证方式,分别为Http、Cookie、Config,安全性依次降低,建议在自己电脑上学习之用的时候用Config方便,可以直接把用户名和密码填入下面两行。用作服务器时,强烈建议使用Http方式或者cookie方式。一般用Http方式最好

PHP教程 环境配置

4)找到$cfg[‘DefaultLang’] = ‘en-iso-8859-1’;

替换为$cfg[‘DefaultLang’] = ‘gb2312’;

找到$cfg[‘DefaultCharset’] = ‘iso-8859-1’;

替换为$cfg[‘DefaultCharset’] = ‘gb2312’;

PHP教程 环境配置

5)设置完成。在IE浏览器中输入http://localhost/phpmyadmin,即可进行相关操作

PHP教程 环境配置

1.8 验证

1)系统是否支持PHP

使用记事本等软件编辑文件,内容如下

<?phpphpinfo();

?>

保存为phpinfo.php,并放入WWW根目录(这里是C:Inetpubwwwroot目录)。在IE浏览器中输入http://localhost/phpinfo.php,回车后出现所有PHP环境信息,如果成功就证明系统已经支持PHP(如下图所示)

PHP教程 环境配置

2)PHP是否成功地连接上MySQL

使用记事本等软件编辑文件,内容如下

<?
$db_usrname=”root”;

//此处填你的用户名,本例中为root $db_password=””;

//此处填你的密码,本例中为空 $conn=mysql_connect(“localhost”,$db_usrname,$db_password) or die (‘I cannot connect to the database.’);

mysql_select_db(“test”,$conn);

echo “Success”;

?>

PHP教程 环境配置

保存为dblinktest.php,并放入WWW根目录(这里是C:Inetpubwwwroot目录)。在IE浏览器中输入http://localhost/dblinktest.php,回车如果出现”Success”字样就证明PHP已经成功地连上了MySQL

PHP教程 环境配置

其他问题

1、MySQL的帐号为:root,密码无,即为空。数据库,可以自己随意创建

2、本示例用到的网页存放目录(WWW根目录):C:Inetpubwwwroot

3、安装网站进行调试

1.9 设置404错误

如果用户访问不存在的页面,则执行URL转向到某一指定的错误面上,其方法为设置404错误转向。 其方式分为IIS环境与ApacheServer环境两种情况。

1.如何在IIS环境下设置404错误页面?

打开IIS管理器 =》点击要设置自定义404网点的属性=》点击自定义错误选项=》选中404页=》选中并打开编辑属性=》按浏览选择你要的404页=》按确定保存退出=》错误页面生效。

正常这样是可以的,但有些2003系统的IIS设置就是不行,就可以用到下面的方法:

错误信息 设置成 URL,格式为 /404.htm,把 404.htm 放在网站跟目录下,或者 /文件夹/404.htm,把 404.htm 放在网站/文件夹/目录下。

2.如何在ApacheServer环境下设置404页面?

为Apache Server设置 404错误页面的方法很简单,只需在.htaccess 文件中加入如下内容即可:

ErrorDocument 404 /notfound.php

注意:

1.切记不要将404错误转向到网站主页,否则可能会导致主页在搜索引擎中消失

2.切记不要使用绝对URL(例如:http://www.abc.com/websiterror/404.htm形式),如果使用绝对URL返回的状态码是”302″+”200″。

正确的做法是在 .htaccess 中加入,ErrorDocument 404 /HttpErrors/404.html,而不是ErrorDocument 404 http://www.abc.com/websiterror/404.html,前者返回的是 404 状态码,而后者返回的是 200 状态码。

如果一个 404 页面的内容小于 512b,IE 会认为该 404 页面不够友好,在 IE 下将不会成功返回该 404 错误页面。

1.10 设置robots.txt防止某路径中的文件被搜索引擎抓取

在网站的根目录下建立一个robots.txt的文本文件,注意文件名称是小写字母。其内部语句的语法格式如下:

User-agent:* // *即为指定所有的搜索引擎都不能搜索下面指定的目录

Disallow:/xsjht/         // 用Disallow指定不允许搜索引擎搜索的目录

Disallow:/subweb/images/      // 在一个robots.txt中可以使用多个Disallow

玩转树莓派:树莓派下载安装WordPress搭建网站

学习在您的Raspberry Pi上设置LAMP(Linux,Apache,MySQL,PHP)堆栈,并将其配置为Web服务器。您将下载并安装WordPress并设置一个基本网站,您可以在与Pi相同的网络上的任何设备上访问该网站。

设置Apache Web服务器

Apache是一个受欢迎的Web服务器应用程序,您可以在Raspberry Pi上安装它,以便它可以提供网页。

Apache可以通过HTTP提供HTML文件,其他模块可以使用PHP等脚本语言来提供动态网页。

安装Apache首先apache2通过在终端中键入以下命令来安装软件包:

sudoapt-getinstallapache2-y

测试Web服务器

默认情况下,Apache将测试HTML文件放在Web文件夹中。当您浏览到http://localhost/Pi本身或http://192.168.1.10从网络上的另一台计算机(或任何Pi的IP地址)浏览时,将提供此默认网页。要查找Pi的IP地址,hostname -I请在我们的文档中键入命令行(或阅读更多关于找到您的IP地址)。

浏览到默认网页,无论是在Pi上还是从网络上的其他计算机浏览,您应该看到以下内容:

玩转树莓派:树莓派下载安装WordPress搭建网站

这意味着你有Apache工作!

更改默认网页

该默认网页只是文件系统上的一个HTML文件。它位于

/var/www/html/index.html。

注意:目录/var/www(Raspbian Wheezy),但现在/var/www/html(Raspbian Jessie)

导航到终端中的这个目录,看看里面的内容:

cd/var/www/htmlls-al

这将告诉你:

total12drwxr-xr-x2rootroot4096Jan801:29.drwxr-xr-x3rootroot4096Jan801:28..-rw-r–r–1rootroot177Jan801:29index.html

这表明有一个文件

/var/www/html/被调用index.html。该.指目录本身/var/www/html和..指父目录/www/。

list是什么意思

  1. 文件或目录的权限

  2. 目录中的文件数(或者1是文件)。

  3. 拥有该文件或目录的用户

  4. 拥有文件或目录的组

  5. 文件大小

  6. 最后修改日期和时间

如您所见,默认情况下,html目录和index.html文件都由root用户拥有,因此您需要使用sudo它们进行编辑。尝试编辑此文件并刷新浏览器以查看网页更改。按下Ctrl + X并Enter保存并退出。

安装PHP

PHP是一个预处理器;

它是当服务器收到网页请求时运行的代码。它运行,解决了页面上需要显示的内容,然后将该页面发送到浏览器。与静态HTML不同,PHP可以在不同的情况下显示不同的内容。其他语言能够实现这一点,但由于WordPress是用PHP编写的,所以我们需要使用这个时间。PHP是网络上非常流行的语言;

像Facebook和维基百科这样的大型项目是用PHP编写的。

使用以下命令安装PHP和Apache包:

sudoapt-getinstallphp5libapache2-mod-php5-y

测试PHP

创建文件index.php:

sudoleafpadindex.php

(或使用nano)

在其中添加一些PHP内容:

<?phpecho”helloworld”;

?>

现在保存文件。接下来删除index.html因为它需要超过index.php的优先级:

sudormindex.html

刷新浏览器 你应该看到“你好世界”。这不是动态的,但它仍然由PHP提供。如果您看到原始的PHP而不是“hello world”,请重新加载并重新启动Apache,如下所示:

sudoserviceapache2restart

否则尝试一些动态的,例如:

<?phpechodate(‘Y-m-dH:i:s’);

?>

或显示您的PHP信息:

<?phpphpinfo();

?>

安装MySQL

MySQL(发音为My Sequel或My SQL)是一个流行的数据库引擎。像PHP一样,其在网络服务器上的压倒性存在增强了其受欢迎程度。这就是为什么像WordPress这样的项目使用它,为什么这些项目是如此受欢迎。

通过在终端中输入以下命令来安装MySQL Server和PHP-MySQL软件包:

sudoapt-getinstallmysql-serverphp5-mysql-y

安装MySQL时,将要求您输入root密码。您需要记住这一点,才能让您的网站访问数据库。

现在重新启动Apache:

sudoserviceapache2restart

下载WordPress

您可以使用该命令从wordpress.org下载WordPress wget。有趣的是,WordPress的最新版本的副本始终可以在wordpress.org/latest.tar.gz和wordpress.org/latest.zip上获得,所以您可以获取最新版本,而无需在网站上查找。在撰写本文时,这是版本4.5。

浏览到/var/www/html/并将WordPress下载到此位置。您需要首先清空文件夹(请务必检查您是否在运行前不要删除所需的文件rm);

将该文件夹的所有权更改为pi用户。

cd/var/www/html/sudorm*sudowgethttp://wordpress.org/latest.tar.gz

现在解压缩tarball,将其提取的文件夹的内容移动wordpress到当前目录,并删除(现在为空)文件夹和tarball以整理:

sudotarxzflatest.tar.gz

在这里运行lsor(tree -L 1)命令将会显示一个WordPress项目的内容:

.├──index.php

这是默认WordPress安装的源。您编辑以自定义您的安装的

wp-content文件属于该文件夹。

您现在应该将这些文件的所有权更改为Apache用户:

sudochown-Rwww-data:.

设置您的WordPress数据库

要设置您的WordPress网站,您需要一个数据库。

mysql在终端中运行命令并提供您的登录凭据(例如用户名root,密码password):

mysql-uroot-ppassword

这里我password在命令行上提供了我的密码(这个词)-p您的密码之间没有空格。或者,您只需提供一个空-p标志,等待被要求输入密码:

mysql-uroot-p

现在,系统将提示您输入您之前创建的root用户密码。一旦连接到MySQL,您可以创建WordPress安装将使用的数据库:

mysql>createdatabasewordpress;

注意结尾语句的分号。成功后,您应该看到以下消息:

QueryOK,1rowaffected(0.00sec)

退出MySQL提示符Ctrl + D。

WordPress配置您需要找到您的Pi的IP地址才能在浏览器中访问它,因此在终端中键入命令hostname -I。导航到http://YOUR-IP-ADDRESS例如http://192.168.1.5在您网络浏览器。

你应该看到一个WordPress weclome页面。

玩转树莓派:树莓派下载安装WordPress搭建网站

点击Let’s go!按钮。

现在填写基本网站信息如下:

DatabaseName:wordpress

并单击Submit以继续。现在点击Run the install按钮。现在你越来越近了

玩转树莓派:树莓派下载安装WordPress搭建网站

填写信息:给您的网站一个标题,创建用户名和密码并输入您的电子邮件地址。点击

Install WordPress按钮,然后使用您刚创建的帐户登录。

现在,您已经登录并设置了您的网站,您可以通过在Pi上的浏览器或网络上的另一台计算机上访问您的IP地址来查看该网站。要重新登录(或另一台计算机),请转到http://YOUR-IP-ADDRESS/wp-admin。

友情链接建议您更改永久链接设置,使您的网址更加友善。

为此,请登录到WordPress并转到仪表板。转到Settings然后Permalinks。选择该Post name选项并单击Save Changes。

您需要启用Apache的rewrite mod:

sudoa2enmodrewrite

您还需要告知提供站点的虚拟主机,以允许覆盖请求。

编辑虚拟主机的Apache配置文件:

sudoleafpad/etc/apache2/sites-available/000-default.conf

(或使用nano)

在第1行之后添加以下行:

<Directory”/var/www/html”>

确保它是

<VirtualHost *:80>

这样的:

<VirtualHost*:80>

然后再次重新启动Apache:

sudoserviceapache2restart

定制

WordPress是非常可定制的。通过在页面顶部的WordPress横幅中单击您的网站名称(登录时),您将被带到仪表板。从这里您可以更改主题,添加页面和帖子,编辑菜单,添加插件等等。这只是在Raspberry Pi的Web服务器上设置一些有趣的东西。

接下来是什么?

  • 尝试将网页和帖子添加到您的网站

  • 尝试从外观菜单安装不同的主题

  • 尝试自定义您的主题,或创建自己的主题

  • 尝试使用您的Web服务器向您的网络上的人显示有用的信息

原文始发于:玩转树莓派:树莓派下载安装WordPress搭建网站

|

了解 MySQL 双活同步复制四种方案

对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束。

  基于MySQL原生复制主主同步方案  

了解 MySQL 双活同步复制四种方案

这是常见的方案,一般来说,中小型规模的时候,采用这种架构是最省事的。

两个节点可以采用简单的双主模式,并且使用专线连接,在master_A节点发生故障后,应用连接快速切换到master_B节点,反之也亦然。有几个需要注意的地方,脑裂的情况,两个节点写入相同数据而引发冲突,同时把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做,使用更新的数据版本5.7+,可以利用多线程复制的方式可以很大程度降低复制延迟,同时,对复制延迟特别敏感的另一个备选方案,是semi-sync半同步复制,基本上无延迟,不过事务并发性能会有不小程度的损失,特别是在双向写的时候,需要综合评估再决定。

了解 MySQL 双活同步复制四种方案

  基于Galera replication方案  

Galera是Codership提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性,基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC)。

了解 MySQL 双活同步复制四种方案
了解 MySQL 双活同步复制四种方案
了解 MySQL 双活同步复制四种方案

目前PXC用的会比较多一些,数据严格一致性,尤其适合电商类应用,不过PXC也是有其局限性的,如果并发事务量很大的话,建议采用InfiniBand网络,降低网络延迟,因为PXC存在写扩大以及短板效应,并发效率会有较大损失,类似semi-sync半同步复制,Gelera实际只能用三个节点,网络抖动造成的性能和稳定性习惯性问题

  基于Group Replication方案  

了解 MySQL 双活同步复制四种方案

通过Paxos协议提供数据库集群节点数据强一致保证,MGR准确来说是MySQL官方推出的高可用解决方案,基于原生复制技术,并以插件的方式提供,并且集群间所有节点可写入,解决了单个集群的写入性能,所有节点都能读写,解决网络分区导致的脑裂问题,提升复制数据的可靠性,不过现实还是有些残酷,目前尝鲜的并不是很多,同时仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测,必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set

COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景,目前一个MGR集群最多支持9个节点,不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚,二进制日志不支持binlog event checksum

  基于canal方案  

对于数据库的实时同步,阿里巴巴专门有一个开源项目,即otter来实现分布式数据库的同步复制,其核心思想仍然是通过获取数据库的增量数据日志,来进行准实时的同步复制。因此otter本身又依赖于另外一个开源项目即canal,该项目重点则是获取增量数据库同步日志信息。

当前otter的重点是实现mysql间的数据库同步复制,基本即利用的类似技术来实现两个mysql数据库间的双向同步数据库复制。要注意这个双向本身指既可以A->B,也可以从B->A,在某个时间节点本身是单向的。

主从复制分成三步:
了解 MySQL 双活同步复制四种方案

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);

slave将master的binary log events拷贝到它的中继日志(relay log);

slave重做中继日志中的事件,将改变反映它自己的数据。

canal原理相对比较简单:
了解 MySQL 双活同步复制四种方案
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议

mysql master收到dump请求,开始推送binary log给slave(也就是canal)
canal解析binary log对象(原始为byte流)

更多参考 https://github.com/alibaba/canal

MySQL安全策略

 

数据是企业的核心资产,特别是敏感数据,稍有不慎,就会造成数据泄露、非法窃取、恶意破坏等,网络上经常会出现一些社工资源,还有一些敏感数据的交易,大部分的数据都是被非法获取的,我们需要时刻做好安全防护,下面讲针对安全重点谈谈如何从系统层,网络层,应用层,管理层,数据库层来保护数据,当然这里面的部分策略是相互耦合的,不过这个从安全的角度上而言,耦合也是为了更好的保护数据,还有就是,某一策略的缺陷可能会造成木桶效应也需要大家的关注。

系统层

禁用不必要的系统服务,只开必须的进程

禁止使用root账号远程登录

禁止使用root账号启动mysqld等普通业务服务进程

设置GRUB密码

设置专用账号,针对每个用户访问,不使用公用账号

设置系统层的操作审计,记录所有ssh日志

设置操作系统的防火墙,允许部分IP地址的访问

设置操作系统的端口,允许部分端口的访问

设置默认的数据库端口或者SSH端口

设置MySQL及其他数据库服务相关目录权限

设置操作系统历史记录的清除

禁止外网访问,如果实在有需求,可以临时开启,使用完毕需要及时关闭

条件允许可以使用ssh key认证,不允许远程密码登入

条件允许可以使用PAM认证做到账号的统一管理,也更方便、安全

条件允许可以部署堡垒机,所有连接远程服务器都需要先通过堡垒机,堡垒机上就可以实现所有操作记录以及审计功能了。

网络层

设置操作系统的防火墙,允许部分IP地址的访问

设置操作系统的端口,允许部分端口的访问

服务器区域的网络隔绝,限制办公网络连接,需要连接通过跳板机访问,并做好记录

禁止外网访问,如果实在有需求,可以临时开启,使用完毕需要及时关闭

应用层

使用安全模块或者代码,防止注入或者泄漏

使用代码审计工具定期审核和安全扫描等

使用中间件,避免应用直接查库

对于账号信息避免明文存储,使用专用加密算法加密

对敏感数据进行加密或者规则脱敏

不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永远不要相信用户提交的数据!要做到验证

数据库层

参考 MySQL 安全规范

管理层

关于备份

当你有了备份,你不仅仅需要保证备份的多副本,还要保证其安全性,这里面的安全性包括内部安全,外部安全。

很多时候外部反而是安全的,一个有效的备份经历加密、访问控制,别人无论是获取还是解密都需要花费大量的时间的,而内部往往更容易出问题,千里之堤,毁于蚁穴。

关于审计

数据库审计能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。

它通过对用户访问数据库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据安全。

审计对数据库记录和行为进行独立的审查和估计,其主要作用和目的包括以下几个方面:

对可能存在的潜在攻击者起到威慑和警示作用,核心是风险评估。

测试系统的控制情况,及时进行调整,保证与安全策略和操作规程协调一致。

对已出现的破坏事件,做出评估并提供有效的灾难恢复和追究责任的依据。

对系统控制、安全策略与规程中的变更进行评价和反馈,以便修订决策和部署。

协助系统管理员及时发现网络系统入侵或潜在的系统漏洞及隐患。

有个不知道算奇怪还是正常的事情,不知道多少人给生产恢复过数据,这里面不谈因由,只有做过的人才知道这其中的坑有多少,所以也就需要大家对于各种恢复手段都有所了解,乃至于熟练掌握。

虽然防患未然还是比较困难的,毕竟各种情况都会发生,但是,可以未雨绸缪,从安全上讲,有了审计可以大大减少这类事情的发生。

对于数据库而言,无论是硬件设备还是软件审计都会加大数据库的压力,从性能的损耗上讲,事后审计是比较折中的策略,这边先讲下软件部分的,无论是MySQL官方还是MariaDB或者Percona还是其他的都有一套自己的审计产品。

下面列下常用的几种

MariaDB Audit Plugin(https://mariadb.com/kb/en/mariadb/about-the-mariadb-audit-plugin/),
Percona(https://www.percona.com/doc/percona-server/5.6/management/audit_log_plugin.html),
MySQL(https://dev.mysql.com/doc/refman/5.7/en/audit-log.html),
mcafee(https://github.com/mcafee/mysql-audit)等等功能都差不多

主要用哪个还得看你适合哪个,如果你有足够的资源可以考虑采用硬件的模式,尽量选择专门审计设备的设备,然后根据定期的报表检查你的相关配置。

关于架构

我们一直都在追求或者说改进自己的架构而成为更好的架构,高可用(High Availabiltity)是一个常用的标准,指标的话至少3个9目标4个9或者更多个9,不过随之带来的是成本,毕竟事务的两面性决定了不可能完美,我们始终要明白高可用的核心是什么,业务的连续性7*24? 其实也并不全是,从安全的角度而言,高可用的架构核心是数据冗余,其次才是业务的连续性,目前常用的架构也基本上遵从这个原理
不过有个问题就是大家想过没有,说个偏门的问题,即使你的环境是高可用,如果误删除了你该如何?高可用架构的多份数据也并没有什么用,你需要一个延迟的环境,至于延迟的时间,延迟的策略取决于你,可能说这个冗余环境很久都不会被使用,但是,这个就跟备份的道理是一样的,万一呢?完善的架构才能更好的维护业务的高可用。

关于制度

最后说下制度,这边主要说下安全的相关制度,个人觉得主要作用还是威慑,同时也是一个对自己的保护,在企业中,往往关系错综复杂,你需要更好的保护你所接触到的数据,同时也需要保护自己,而对于数据安全而言,有相应的制度去保证,保护我们不犯错,同时也防止我们犯错。

总之,制度的作用在于使我们知道,应该做什么,不应该做什么。

 

|

社区正在进行技术交流

中小金融机构MySQL数据库安全设计及防范

点击阅读原文,参与交流分享

|

 

 

长按二维码关注公众号

MySQL 安全规范

在生产中,安全是相当重要,毕竟你的核心数据都在里面,MySQL因为其开源的流行性,大量个人,企业,政府单位采用,但是,很多部署的时候采用都是默认的配置,这就导致了安全的相对欠缺,你需要针对你的安全有所加强。

总的来说,数据库一般划分为生产库,压测库,准生产库,测试库,开发库。下面部分主要说的是生产库,但其他库也适用。


1 mysql_secure_installation

这是数据库基础的安全设置脚本

a 设置root密码

b 移除匿名用户

c 禁止远程root登录

d 移除test数据库

以上是5.6版本,5.7有所加强但也仅此而以,看看你的环境是否存在上述问题,这个算是是最基本的安全吧。

2 连接访问安全

常见创建用户的时候你需要指定你的ip访问地址范围或者固定ip,一般化而言,只有特定唯一的几个ip的才会访问,或者说你可以采用代理访问的方式,减少应用直接访问你的数据库,而且现在很多中间件也都有白名单机制,原则上是把非法请求防止在数据库以外的地方。

规范数据库管理软件,实现管理软件的标准、统一化,还有严禁杜绝开启外网访问,如果客户端在远程,就根本不应该直接访问数据库,而应该使用中间件堡垒机或其他替代方案。

为了防止连入数据库的应用程序存在后门,造成数据库安全隐患,检查所有连接数据库程序的安全性。通过使用堡垒机或者其他监控登录数据库,禁止对数据库的直接操作。

对已经连接的IP网段进行规范化、统一化的管理,定期进行权限复核操作,对系统所属IP、用户进行权限梳理工作。

对员工进行安全培训,增强员工的系统安全观念,做到细心操作,安全操作。

确保访问数据库的主机为已知用户或者主机,使用专门主机与数据库进行连接。

对重要业务表的所有行为,全部审计,审计同时所有包括即使是DBA的DDL操作行为
最后是报表系统,利用审计的相关日志,出具系统化的审计报告。

3 权限安全

权限这块无可厚非,在简历之初遵循最小权限原则,坚持最小权限原则,是数据库安全的重要步骤。

很多时候我们不知道具体的最小权限是什么,你说一个账号到底需要什么样权限才合适,才不会影响业务?这个不是很好界定。我们需要知道在设置权限时的信息,要授予的权限级别,库级别,表级别,列级别,或者其他超级权限,要授予的权限类型,增删改查等

从mysql.user表来看
Select_priv/Insert_priv/Update_priv/Delete_priv/Create_priv/Drop_priv
Reload_priv/Shutdown_priv/Process_priv/File_priv/Grant_priv/References_priv
Index_priv/Alter_priv/Show_db_priv/Super_priv/Create_tmp_table_priv/Lock_tables_priv
Execute_priv/Repl_slave_priv/Repl_client_priv/Create_view_priv/Show_view_priv/Create_routine_priv/
Alter_routine_priv/Create_user_priv/Event_priv/Trigger_priv/Create_tablespace_priv

用户名,IP地址,是否需要连接数控制,SSL,过期时间等,不要怕麻烦,可能前期设置的时候比较繁琐,但是,一个好的基础设置,才是安全的保障,做到需要什么给什么,而不是。

4 账户安全

用户账户划分原则
超级管理员账号
系统应用账号(比如备份,监控,审计等)
应用业务账号
业务人员账号
开发人员账号
测试人员账号
其他专用账号

主要是防止泄漏,非必要人员不需要知道账号的名称,同时需要制定相应的命名规则,还有就是合理使用自己的账号密码,保护好你的账号密码,对于绝无必要的用户,先禁用,后期删除,要做到无匿名账户和无废弃账户。

5 目录文件安全

提高本地安全性,主要是防止mysql对本地文件的存取,会对系统构成威胁,还有Load DATA LOCAL INFILE,禁用该功能。

这个主要是防止误删除,非权限用户禁止访问目录,还有就是数据文件禁止访问,或者采用更改常用的目录路径,或者通过chroot,要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。

6 密码安全

密码强度复杂性

尽量并且不要使用固定密码,实行每个用户单独密码,长度在16位以上 0-9a-zA-Z~!@#$%^&

*()-+ 随机组合。

密码过期机制

根据公司的情况设定密码过期时间,定期更改,同时不可使用重复密码。

密码保存机制

为了方便管理,可能会采用一个密码表,要加强对于密码表的维护更新,最重要的是保证不泄漏。

7 漏洞安全

常规的方式是安装补丁,不过这个往往比较麻烦,主要是版本升级,还有就是防护策略。

8 被忽视的SSL

由于性能或者其他方面原因,很多生产环境并没有使用,不过从5.7+开始,已经好很多了,有需要的加强安全防范其实可以尝试下了。

https://dev.mysql.com/doc/refman/5.7/en/mysql-ssl-rsa-setup.html

9 防火墙安全

一般化数据库前面都会有主备的墙,不过从成本上考虑,很多企业都是单个或者裸奔的,有自己的硬件防火墙最好,没有的话也可以使用系统自带的防火墙,然后在加上其他白名单和中间件白名单过滤辅助措施,也能防止一部分问题。

10 端口安全

默认端口是3306,这个最好修改下,为了方便记忆,你可以根据的ip地址来加密动态调整,不过如果生产网络允许,也可以定期修改,最好不要影响研发进度。

11 记录安全

删除操作系统记录的敏感数据,比如.mysql_history、.bash_history 等,及时清理,移除和禁用.mysql_history文件。

人是安全的主导,管理的对象要从两个角度来看,从信息角度来说就是MySQL本身的安全,要防止数据的丢失和免遭破坏;从技术的角度来说就是整个系统的安全,要防止系统的瘫痪和免遭破坏。

最后说句题外话,监控和审计,安全主要是防患于未然,没有谁希望一天到晚接到各种警报,最好根据公司的实际情况订个详细的规章制度,不要觉得这个麻烦,有些你可能并不觉得有用,但是呢?我希望是没有但是。