PHP7以上版本已经废除了mysql函数库,故mysql_connect()函数已经无法使用。新的函数库mysqli及PDO可以完全取代该库。本文主要介绍两种库函数下,PHP与mysql的连接及遇到的问题。

经实验,所有内容在ubuntu18.04.3下也完全可以运行。

安装问题

PHP与mysql的连接使用apache+PHP+mysql,由于kali中已经预先安装好了各个部分,具体细节见参考资料:Kali安装Apache、MySQL、PHP。这里谈谈安装时需要注意问题,apache及mysql的安装一般不会出现问题,重点在PHP的安装。按上参考资料配置完成后,在/var/www/html文件夹下建立新文件index.php,内容如下:

<?php

phpinfo();

?>

开启apache,默认是开启的,如果不放心可以运行下列命令:

/etc/init.d/apache2 start

出现以下结果:

kali远程链接mysql kali连接mysql_web


说明服务器已经开启,浏览器中输入地址:http://localhost/index.php,出现正常php配置信息:

kali远程链接mysql kali连接mysql_php_02

页面中提供了PHP配置的详细信息及其已经安装的扩展模块,需要强调扩展模块!!!因为这可能造成一个非常常见的问题:PHP信息页面正常显示,静态PHP页面也可以显示,动态交互页面却是空白!,这往往是由于PHP对应的扩展模块没有安装导致的。如本次所需要用到的模块是mysqli和PDO(这两个库是独立的,只不过这里使用两个库分别实现PHP与mysql的连接),但是在最新的PHP版本中却不会默认安装mysqli库,这导致PHP页面中的mysql相关的函数不会执行,形成页面空白。查看PHP已经安装的扩展模块有两个方法:一是上面浏览器中显示的PHP配置信息,查找有关扩展模块

kali远程链接mysql kali连接mysql_web_03


kali远程链接mysql kali连接mysql_php_04


二是直接命令行输入:

php -m

会列出所安装的扩展包:

kali远程链接mysql kali连接mysql_mysql_05


这里我已经安装好了,如过没有这些模块,可以通过下列命令安装(更详细资料参考2):

sudo apt-get install php7.4-mysqli //这里我的php版本是7.4.9
sudo apt-get install php7.4-PDO

至此,所有配置已经完成。

MySQL创建用户与授权

kali下mysql可以免密登录,默认为root用户,而在ubuntu下则需要使用更加详细的命令:

mysql  #kali下
--------------------------------
mysql -u root -p #kali下和ubuntu下均可,更正式

kali下登录:

kali远程链接mysql kali连接mysql_web_06


或者(ubuntu、kali均可,推荐)

kali远程链接mysql kali连接mysql_php_07


这里最常见的一个问题就是报错:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock’

网上有各种解决问题的办法,有时候只要重启mysql便可解决这个问题:

systemctl restart mysql

创建用户

数据库操作命令大小写均可。
进入Mysql后,相关用户创建及授权命令如下:

#drop database kali; #由于已经完成数据库的操作,数据库已经存在,这里将其删除,重新演示
show databases; #列出当前存在的数据库
create database kali;  #创建数据库kali
use kail;  #使用kali
#drop user 'lee'@'localhost';  #删除当前用户lee
create user 'lee'@'localhost' identified by '123';  #创建新用户,这条命令涉及PHP代码,下面详细说
select user,host,password from mysql.user; #列出所有用户、所属主机、密码(默认经过加密)

kali远程链接mysql kali连接mysql_mysql_08


对使用的关键语句:**create user ‘lee’@‘localhost’ identified by ‘123’;**说明:

基本格式:create user ‘username’@‘host’ identified by ‘password’;

username:创建的用户名;

host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%;

password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器;

创建好的用户信息会放在mysql.user中。

用户授权

对所创建的新用户进行授权,授权指的是用户可以对数据库进行的操作,如增删改查等。命令如下:

grant all privileges on kali.* to 'lee'@'localhost' identified by '123' with grant option;
flush privileges;  #权限刷新

授权语句格式:
grant privileges on databasename.tablename to ‘username’@‘host’
说明:
privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示。

其实到此已经可以检测PHP与mysql的连接,为了更清楚地表示,可以将数据库中的内容打印在页面。首先创建内容。

数据库内容创建

基本数据库操作,命令如下:

show tables;  #显示当前数据库下所有列表
create table users(
    -> id int(10),
    -> username varchar(7) );  #创建table,赋予属性
describe users;  #描述表
insert into users value (1,'paradox');  #插入数据
select * from users;  #显示数据

kali远程链接mysql kali连接mysql_PHP_09

PHP7连接mysql

PHP7中已经废除mysql库,想要建立PHP与mysql的交互,可以通过mysqli及PDO库函数进行。关于mysql、mysqli及PDO的区别与使用,本文不作具体说明。详细地可以阅读参考资料4-6。

PHP mysqli与mysql交互

mysqli有面向对象和面向过程两种。在文件夹/var/www/html/下建立文件mysqli.php,内容如下:

<?php
    /*
    面向对象风格,格式及参数说明:
    $mysqli = new Mysqli($serve,$username,$password,$dbname);
    $serve:所使用的用户主机名称,这里是本地用户localhost
    $username: 数据库用户名,上面设置为lee
    $password:用户对应的密码
    $dbname:所使用的数据库。默认的话,会调用上一个打开的数据库
    */
    $mysqli = new mysqli("localhost", "lee", "123", "kali");
    if(!$mysqli)  {
        echo"database error";
    }else{
        echo"php env successful";
    }
    $mysqli->close();
?>

浏览器中输入地址:http://localhost/mysqli.php,连接成功。

kali远程链接mysql kali连接mysql_web_10

PHP PDO与mysql交互

PDOPDO比MySQLi最大的优点就是PDO支持很多种数据库,而MySQLi只支持MySQLi。当程序以后想从mysql换成sql server或者oracle时,PDO的优势就能体现出来了,因为换数据库对于程序接口是透明的,php代码改动很小,如果你是用MySQLi,那么所有用到数据库的地方都要重写。
PDO建立连接的方法有三种:通过参数形式连接数据库;通URI连接数据库;通过配置文件形式连接数据库,后两种需要配置文件,这里采用第一种。同样,在/var/www/html/下建立文件pdo.php,内容如下:

<?php
$dbms='mysql';
$dbName='kali';
$user='lee';
$pwd='123';
$host='localhost';
$dsn="$dbms:host=$host;dbname=$dbName";
$pdo=new PDO($dsn,$user,$pwd);
echo "PDO连接MySQL成功";
?>

这里参数含义同上,只是要注意$dsn的格式。在浏览器输入地址:http://localhost/pdo.php,连接成功如下:

kali远程链接mysql kali连接mysql_web_11

当然也可以对数据库的内容进行输出,建立文件pdoo.php,内容如下:

<?php
header("Content-type:text/html;charset=utf-8");
$dns = 'mysql:host=localhost;dbname=kali';
$username = 'lee';
$password = '123';

try{ // PDO连接数据库若错误则会抛出一个PDOException异常
	$PDO = new PDO($dns,$username,$password);
	$result = $PDO->query('select * from users');
	$data = $result->fetchAll(PDO::FETCH_ASSOC); 
	// PDO::FETCH_ASSOC表示将对应结果集中的每一行作为一个由列名索引的数组返回
	print_r($data);
} catch (PDOException $error){
	echo 'connect failed:'.$error->getMessage();
}

?>

浏览器中输入:http://localhost/pdoo.php,显示数据库内容:

kali远程链接mysql kali连接mysql_PHP_12


这就是前面在数据库中插入的数据:

kali远程链接mysql kali连接mysql_kali远程链接mysql_13


奇怪的是,有时代码完全正确,但是浏览器却是空白,此时可能需要重启PHP。这里具体的问题在哪不是很清楚。