PHP数据库MySQL笔记


一、Web数据库架构的工作原理

一个用户的浏览器发出一个HTTP请求,请求特定的Web页面,在该页面中出发form表单提交到php脚本文件(如:msg.php)中处理
Web服务器接收到对msg.php页面的请求后,检索文件,并将其传递给PHP引擎处理
PHP引擎开始解析脚本。脚本主要包括了连接数据库和执行查询的命令。PHP启动了对MySQL服务器的连接并向该服务器发送适当的查询。
MySQL服务器接收到数据库查询的请求,开始处理这个查询,并将查询结果返回给PHP引擎。
PHP引擎完成了脚本的运行后,将该HTML返回Web服务器。
Web服务器再将HTML返回给客户端浏览器,用户就可以看到响应后的结果页面。
从Web查询数据库的基本步骤:检查并过滤来自用户的数据

首先,我们将过滤用户可能在其搜索条件的起始或结束位置不小心输入的空白字符,这是用函数trim()来实现。 我们这么麻烦的检查用户输入数据的原因是防止多个接口连接数据库,因为用户从不同的界面进入,这样可能导致安全问题。

然后,当准备使用用户输入的任何数据时,也要适当的过滤一些控制字符,当用户输入数据到数据库时必须转义数据,,此时 使用盗的函数有addslashes()函数、stripslashes()函数和get_magic_qutoes_gpc()函数。addslashes()函数为了数据 库查询语句等的需要在某些字符前加上了反斜线;stripslashes()函数去掉字符串中的反斜线字符;get_magic_qutoes_gpc()函数 魔术添加转义字符 “\”,获取当前活动配置magic_quotes_runtime设置,如果运行时关闭魔术引号,返回0,否则返回1。我们也可以使用 htmispecialchars()对HTML中的特殊意义字符警醒编码,htmispecialchars()函数把一些预定义的字符转换为 HTML 实体 【预定义的字符是:& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 >】


二、PHP关于MySQL的配置表

MySQL 函数的行为受到 php.ini 中设置的影响。

MySQL 配置选项:
名称 默认 描述 可更改
mysql.allow_persistent "1" 是否允许 MySQL 的持久连接。 PHP_INI_SYSTEM
mysql.max_persistent "-1" 每个进程中最大的持久连接数目。 PHP_INI_SYSTEM
mysql.max_links "-1" 每个进程中最大的连接数,包括持久连接。 PHP_INI_SYSTEM
mysql.trace_mode "0" 跟踪模式。从 PHP 4.3.0 起可用。 PHP_INI_ALL
mysql.default_port NULL 指定默认连接数据库的 TCP 端口号。 PHP_INI_ALL
mysql.default_socket NULL 默认的 socket 名称。PHP 4.0.1起可用。 PHP_INI_ALL
mysql.default_host NULL 默认的服务器地址。不适用于SQL安全模式。 PHP_INI_ALL
mysql.default_user NULL 默认使用的用户名。不适用于SQL安全模式。 PHP_INI_ALL
mysql.default_password NULL 默认使用的密码。不适用于SQL安全模式。 PHP_INI_ALL
mysql.connect_timeout "60" 连接超时秒数。 PHP_INI_ALL


在MySQL模块中使用了两种资源类型。第一种是数据库链接的连接句柄,第二种是资源标识符,包含了SQL查询返回的结果集。

如同PHP正则表达式中的预定义常量类似,以下常量由本扩展模块定义,因此只有在本扩展模块被编译到 PHP 中,或者在运行时被动态加载后才有效。

在PHP4.3.0之后版本及PHP5中,允许在mysql_connect()函数和mysql_pconnect()函数中指定更多的客户端标记。下面列出所定义的常量,如表所示:

MySQL 客户端常量
常量 说明
MYSQL_CLIENT_COMPRESS 使用压缩的通讯协议
MYSQL_CLIENT_IGNORE_SPACE 允许在函数名后留空格位
MYSQL_CLIENT_INTERACTIVE 允许设置断开连接之前所空闲等候的 interactive_timeout 时间(代替 wait_timeout)。
MYSQL_CLIENT_SSL 使用 SSL 加密。本标志仅在 MySQL 客户端库版本为 4.x 或更高版本时可用。在 PHP 4 和 Windows 版的 PHP 5 安装包中


mysql_fetch_array() 函数使用一个常量来表示所返回数组的类型。下面是常量的定义:


MySQL fetch 常量
常量 说明
MYSQL_ASSOC 返回的数据列使用字段名作为数组的索引名。
MYSQL_BOTH 返回的数据列使用字段名及数字索引作为数组的索引名。
MYSQL_NUM 返回的数据列使用数字索引作为数组的索引名。索引从 0 开始,表示返回结果的第一个字段。

-----------------------------------------------------
PHP正则表达式预定义常量

PREG 常量
常量 说明
PREG_PATTERN_ORDER 对结果排序使得 $matches[0] 为整个模式的匹配结果的数组,$matches[1] 为第一个括号内的子模式所匹配的字符串的数组,等等。本标记仅用于 preg_match_all()
PREG_SET_ORDER 对结果排序使得 $matches[0] 为第一组匹配结果的数组,$matches[1] 为第二组匹配结果的数组,等等。本标记仅用于 preg_match_all()
PREG_OFFSET_CAPTURE PREG_SPLIT_OFFSET_CAPTURE 的说明。本标记自 PHP 4.3.0 起可用。
PREG_SPLIT_NO_EMPTY 本标记使 preg_split() 仅返回非空的结果。
PREG_SPLIT_DELIM_CAPTURE 本标记使 preg_split() 也捕获定界符模式中的括号表达。本标记自 PHP 4.0.5 起可用。
PREG_SPLIT_OFFSET_CAPTURE 如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。本标记自 PHP 4.3.0 起可用且仅用于 preg_split()


三、PHP数据库连接

PHP5为连接MySQL提供了新的函数库。这个函数库是 mysqli(i表示改进)。这个函数库适用于MySQL版本4 及其以后版本。在版本4中,MySQL添加了一个新的连接协议,其执行速度更快,而且mysqli允许使用它。mysqli函数库允许使用面向对象或面向过程的语法。
面向对象方法:$conn = new mysqli('localhost', 'user', 'password','data_base');返回一个对象
面向过程方法:$conn = mysqli_connect('localhost', 'user', 'password','data_base');这个函数返回一个资源,而不是对象。这个资源表示到数据库的连接,且如果使用过程方法,必须将这个资源传递到mysql所有其他函数。这与文件处理函数非常类似,如fopen()的工作方式。
MySQL的大多数函数都有面向对象和面向过程接口。通常,二者的差异在于过程版本的函数名称是以mysql_开始的,同时要求传入通过mysql_connect()函数获得的资源句柄。对这个规则来说,数据库连接是一个异常,因为它是由mysql对象的构造函数来创建的。

请注意:

当连接到数据库是,通常会议错误抑制符@作为第一含代码。这样可以巧妙的处理任何错误,也可以通过异常来处理。
另外,MySQK对同时连接 数据库的连接数量有一定的限制。MySQL参数max_connections决定了同时连接的个数,该参数和相关的Apache参数MaxClients的作用是告诉服务器拒绝新的连接请求, 从而保证系统资源不会再系统忙碌时或系统瘫痪时被请求或使用。要设置Apache中的MaxClients参数可以编辑系统中的httpd.conf文件。要为MySQL设置max_connections参数 可以编辑文件my.conf。

这里就几个常见的操作将mysqli和mysql.dll做一个对比。
  1:mysql.dll(可以理解为函数式的方式):

  $conn = mysql_connect('localhost', 'user', 'password'); //连接mysql数据库
  mysql_select_db('data_base',$conn); //选择数据库
  
  $result = mysql_query('select * from data_base');//这里有第二个可选参数,指定打开的连接

  $row = mysql_fetch_row( $result ) ) //为了简单,这里只取一行数据
  echo $row[0]; //输出第一个字段的值

  mysqli也有过程式的方式,只不过开始贯以mysqli的前缀,其他都差不多。如果mysqli以过程式的方式操作的话,有些函数必须指定资源,比如说 mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而mysql_query(SQL语句,'可选')的资源标识是放在后面的,并且可以不指定,它默认是上一个打开的连接或资源。

  2mysqli.dll(对象方式):

  $conn = new mysqli('localhost', 'user', 'password','data_base');
  //这里的连接是new出来的,最后一个参数是直接指定数据库,不用mysql_select_db()了
  //也可以构造时候不指定,然后 $conn -> select_db('data_base')

  $result = $conn -> query( 'select * from data_base' );
  $row = $result -> fetch_row(); //取一行数据
  echo row[0]; //输出第一个字段的值

  更主要的是mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快.

你可能感兴趣的:(PHP语言)