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,内容如下:
phpinfo();
?>
开启apache,默认是开启的,如果不放心可以运行下列命令:
/etc/init.d/apache2 start
出现以下结果:
说明服务器已经开启,浏览器中输入地址:http://localhost/index.php,出现正常php配置信息:
页面中提供了PHP配置的详细信息及其已经安装的扩展模块,需要强调扩展模块!!!因为这可能造成一个非常常见的问题:PHP信息页面正常显示,静态PHP页面也可以显示,动态交互页面却是空白!,这往往是由于PHP对应的扩展模块没有安装导致的。如本次所需要用到的模块是mysqli和PDO(这两个库是独立的,只不过这里使用两个库分别实现PHP与mysql的连接),但是在最新的PHP版本中却不会默认安装mysqli库,这导致PHP页面中的mysql相关的函数不会执行,形成页面空白。查看PHP已经安装的扩展模块有两个方法:一是上面浏览器中显示的PHP配置信息,查找有关扩展模块
二是直接命令行输入:
php -m
会列出所安装的扩展包:
这里我已经安装好了,如过没有这些模块,可以通过下列命令安装(更详细资料参考2):
sudo apt-get install php7.4-mysqli //这里我的php版本是7.4.9
sudo apt-get install php7.4-PDO
至此,所有配置已经完成。
kali下mysql可以免密登录,默认为root用户,而在ubuntu下则需要使用更加详细的命令:
mysql #kali下
--------------------------------
mysql -u root -p #kali下和ubuntu下均可,更正式
kali下登录:
或者(ubuntu、kali均可,推荐)
这里最常见的一个问题就是报错:
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; #列出所有用户、所属主机、密码(默认经过加密)
对使用的关键语句:**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:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示。
更详细权限相关操作见参考资料3:MySQL创建用户与授权。其实到此已经可以检测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; #显示数据
PHP7中已经废除mysql库,想要建立PHP与mysql的交互,可以通过mysqli及PDO库函数进行。关于mysql、mysqli及PDO的区别与使用,本文不作具体说明。详细地可以阅读参考资料4-6。
mysqli有面向对象和面向过程两种。在文件夹/var/www/html/下建立文件mysqli.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,连接成功。
PDOPDO比MySQLi最大的优点就是PDO支持很多种数据库,而MySQLi只支持MySQLi。当程序以后想从mysql换成sql server或者oracle时,PDO的优势就能体现出来了,因为换数据库对于程序接口是透明的,php代码改动很小,如果你是用MySQLi,那么所有用到数据库的地方都要重写。
PDO建立连接的方法有三种:通过参数形式连接数据库;通URI连接数据库;通过配置文件形式连接数据库,后两种需要配置文件,这里采用第一种。同样,在/var/www/html/下建立文件pdo.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,连接成功如下:
当然也可以对数据库的内容进行输出,建立文件pdoo.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,显示数据库内容:
这就是前面在数据库中插入的数据:
奇怪的是,有时代码完全正确,但是浏览器却是空白,此时可能需要重启PHP。这里具体的问题在哪不是很清楚。
本文是在学习SQL注入时,对防止注入的一些PHP转义函数的补充学习,有错误的地方欢迎指出。
参考资料: