php??老师让用php写后端。什么?写惯了java、python。这个看起来像html标签语言的东西写后端是个什么鬼,看起来想落后几千年的原始语言(手动滑稽)。
大概介绍一下,php主要是后端语言,用来连接数据库,写API的。但是PHP也能够镶嵌到前端页面HTML里面像JS一样,也可以单独地写一个文件demo.php,文件里写HTML返回页面,作为初学者的我表示怎么会有这种奇怪的语言。
1.首先,需要下载php(也可以使用集成环境XAMPP,那这里我前端使用REACT写的,并且只是课程项目,那我感觉我并没有那么大的需求,就直接下载PHP扔前端项目里了,主打一个能连接就行),官网链接如下,记得添加php到环境变量。
如果一切顺利,在cmd里敲php -V,你会看到对应的版本,如果不对会报错,请正确添加环境变量。(搜一下怎么配置把)
自己安装的php在连接数据库比如mysql的时候会失败,因为需要新增一个php.ini文件在php安装根目录里面,你可以看到php.ini_developemnt和php.ini_production两个文件,这是官网给推荐的版本,你要用用哪个版本就把相应的文件粘贴复制到php.ini文件里取,然后连接数据库需要自己在最后一行加上
extension=mysqli
extension=php_pdo_mysql.dll
extension_dir = "E:\software\php\ext" //这换上你自己的目录,ext代表扩展包的目录
如果还不行,请查看ext扩展目录下是否存在php_mysqli.dll这个扩展文件。
2.在任意目录下新建一个php文件,test.php
3.连接数据库
3.1
// conn.php
<?php
$servername = "localhost:3306";
$username = "root";
$password = "123456";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
3.2 pdo操作(建议,这种时候直觉一般企业都会要求用这个把,用这个准有好处)
把extension=php_pdo.dll放php根目录php.ini文件最后边
我是把api直接放react目录里了,然后在vscode里下载php扩展,1.php debug 2.php server(这能让php在浏览器中显示)
直接在vscode里面右->php server:server project,在浏览器就会看到连接成功。
$servername="localhost";
$username = "root";
$password = "123456";
$dbname = "petShop";
try {
$pdo = new PDO("mysql:host=$servername", $username, $password);
// 设置 PDO 错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "数据库连接成功<br>";
}
catch(PDOException $e)
{
echo "<br>connect DB error: " . $e->getMessage();
}
4.创建数据库DB
// 1.create Database function petShop
function createDB($pdo){
$sql = "CREATE DATABASE IF NOT EXISTS petShop";
if ( $pdo->query($sql) === TRUE) {
echo "Databse created successfully";
} else {
echo "database already existed ";
}
};
5.插入表和数据
记得把$pdo连上新建的数据库
function seedUsers($pdo,$users)
{
try{
// create table
$pdo->query("CREATE TABLE IF NOT EXISTS users (
id VARCHAR(36) DEFAULT (UUID()) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password TEXT NOT NULL,
image_url VARCHAR(255) NOT NULL
);");
echo "<br />Created 'users' table";
// insert users data
foreach ($users as $user) {
$hashedPassword = password_hash($user["password"],PASSWORD_DEFAULT); // hash encryption,default using bcrypt and cost 10
$pdo->query("INSERT INTO users (id, name, email, password,image_url)
VALUES ('{$user["id"]}', '{$user["name"]}', '{$user["email"]}', '{$hashedPassword}','{$user["image_url"]}');");
}
echo "<br> Seeded users successfully";
}catch(PDOException $e)
{
echo "<br>" . "error in seedUsers:".$e->getMessage();
}
}
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
seedUsers($conn,$users);
- 这里的数组循环注意形式,用到了数组映射,因为PHP没有字典,只有数组映射,用了$users = [["id"=>2],["id"=>3]]这样的形式。数组索引是两种方法,映射索引key,正常数组索引下标,越界不会报错,能用{}代替[]。
- 字符串的拼接有3种形式
1.双引号里使用$自动解析变量,“$name”,但是“$name["id"]”这样索引要加{},不加报错,正确形式为{$name["id"]};2.使用.的拼接符,"I am ".$name."!" ;3. 在1的基础上加上{},"I am{$name}".
$conn = null //pdo关闭连接的方式,连接也会自动关闭
(一些过程中的问题:MySQL不支持默认值为函数UUID(),所以快速一点还是改成id INT AUTO_INCREMENT PRIMARY KEY吧。MySQL和原先的Postgresql语句差很多...改吧)
成功了,接着写吧!!
写一个删除接口API
6.我下载了一个navicat,方便管理mysql。Navicat16安装和激活详细讲解(全网最简单且靠谱)-CSDN博客
7.跨域问题
header("Access-Control-Allow-Origin:*");
前端
next.js切换port,在package.json中编辑scripts下面的"dev": "next dev -p 3001"