Php 错误:SQLSTATE[HY000][2002]没有这样的文件或目录
我知道这类问题可能被问过好几次,但它们都与laravel有关,在我的例子中,这是没有框架的香草php 我有一个表单,它可以从用户那里收集表单,并将其保存到数据库中,但我一直收到关于MYSQL的错误Php 错误:SQLSTATE[HY000][2002]没有这样的文件或目录,php,mysql,Php,Mysql,我知道这类问题可能被问过好几次,但它们都与laravel有关,在我的例子中,这是没有框架的香草php 我有一个表单,它可以从用户那里收集表单,并将其保存到数据库中,但我一直收到关于MYSQL的错误错误:SQLSTATE[HY000][2002]没有这样的文件或目录。以下是我的数据库配置文件和包含它的文件: //数据库配置 是的,我知道处理表单的脚本不安全 另外,当我访问该页面时,我会遇到以下错误 Fatal error: Uncaught PDOException: SQLSTATE[HY
错误:SQLSTATE[HY000][2002]没有这样的文件或目录
。以下是我的数据库配置文件和包含它的文件:
//数据库配置
是的,我知道处理表单的脚本不安全
另外,当我访问该页面时,我会遇到以下错误
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /var/www/html/library/Database.php:19 Stack trace: #0 /var/www/html/index.php(2): require() #1 {main} thrown in /var/www/html/library/Database.php on line 19
如果需要,这就是我使用的sql
如果不存在成员,则创建表(
成员id INT自动递增非空主键,
first_name VARCHAR(255)不为空,
姓氏VARCHAR(255)不为空,
电子邮件VARCHAR(255)不为空且唯一,
参考代码INT不为空
);
整个项目也在docker容器中,下面是docker compose.yml
文件
version: '3.7'
services:
php:
container_name: nairobi_php
build:
context: ./
volumes:
- './src:/var/www/html'
depends_on:
- mysql
ports:
- 80:80
mysql:
container_name: nairobi_mysql
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: CUeHpADRmZCtnTFGctxp
MYSQL_DATABASE: nairobi
MYSQL_USER: admin
MYSQL_PASSWORD: 123456
restart: always
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
adminer:
image: adminer
restart: always
ports:
- 8080:8080
首先,像这样更改您的连接:用以下代码替换Database.php中的代码,并阅读代码中的注释
$host = 'localhost';
$db = 'nairobi';
$user = 'admin';
$pass = '123456';
$charset = 'utf8mb4'; // Always set charset for database
$port = '3308'; //Your port can be 3306 or 3307
$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$dbh = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
现在你的密码!您正在使用prepare语句,这使您的代码足够安全。
检查Database.php
文件的url是否正确,并将您的更改为
require_once "./library/Database.php";
if (isset($_POST['submit'])) {
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email = $_POST['email'];
$reference_code = $_POST['reference_code'];
//You have a `TABLE` name call members so you dont need `TABLE` its causing problem
//Your query should look like this
$sql = 'INSERT INTO members (first_name, last_name, email, reference_code) VALUES (:first_name, :last_name, :email, :reference_code)';
$stmt = $dbh->prepare($sql);
$stmt->execute([$first_name, $last_name, $email, $reference_code]);
//I removed array here which you dont need, you can directly add fields in execute.
$stmt->closeCursor();
//Use `closeCursor()` to free your connection instead unset or close.
}
决赛
确保您创建了一个数据库。
确保在数据库中创建了表调用成员
如果您已经完成了所有这些,那么您的代码将毫无问题地工作
HTML表单应该是这样的,若你们想上传图片,你们需要在表单中添加多重加密
<form action="yourpage.php" method="post">
<div class="container">first_name</b></label>
<input type="text" placeholder="Enter first_name" name="first_name" required>
<label for="last_name"><b>last_name</b></label>
<input type="text" placeholder="Enter last_name" name="last_name" required>
<label for="email"><b>email</b></label>
<input type="email" placeholder="Enter email" name="email" required>
<label for="reference_code"><b>reference_code</b></label>
<input type="text" placeholder="Enter reference_code" name="reference_code" required>
<button type="submit">Login</button>
</div>
</form>
我终于解决了问题,谢谢@Dlk的帮助 问题的原因是因为在
database.php
中,我将mysql的主机称为localhost
,而不是docker compose.yml
文件中mysql服务的名称。因此,database.php
文件应该如下所示:
它与我的docker compose.yml
文件相关
version: '3.7'
services:
php:
container_name: nairobi_php
build:
context: ./
volumes:
- './src:/var/www/html'
depends_on:
- mysql
ports:
- 80:80
mysql:
container_name: nairobi_mysql
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: CUeHpADRmZCtnTFGctxp
MYSQL_DATABASE: nairobi
MYSQL_USER: admin
MYSQL_PASSWORD: 123456
restart: always
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
adminer:
image: adminer
restart: always
ports:
- 8080:8080
谢谢你,伙计,我真的很感谢你的帮助,但现在我又遇到了另一个困难。这是我得到的错误。如果docker containerCheck url中没有添加任何内容,则编辑您的问题并在其底部添加错误。并检查“/library/Database.php”的路径是否正确;是否正确您可以将
localhost
更改为127.0.0.1
或您的ip(如果您有)。查看与docker的连接是否确定“/library/Database.php”;是否在那个地方存在?您是否用应答中的代码更改了database.php中的代码?你们有并没有确认你们的端口是否如我在回答中提到的那个样正确?您确定database.php中没有其他内容吗?第19行是我的代码中的}这是我的See答案上的源代码的样子我更新了!请你做一个屏幕截图,并在其他地方添加一些。我看不到来自imgur.com的任何内容。这是我网站上源代码的更新链接,很高兴你解决了!我在评论中提到,您可能没有看到您是否可以将localhost更改为127.0.0.1或您的ip(如果您有一个ip->您的服务名称)
version: '3.7'
services:
php:
container_name: nairobi_php
build:
context: ./
volumes:
- './src:/var/www/html'
depends_on:
- mysql
ports:
- 80:80
mysql:
container_name: nairobi_mysql
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: CUeHpADRmZCtnTFGctxp
MYSQL_DATABASE: nairobi
MYSQL_USER: admin
MYSQL_PASSWORD: 123456
restart: always
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
adminer:
image: adminer
restart: always
ports:
- 8080:8080