错误:SQLSTATE [HY000] [2002]没有这样的文件或目录

问题描述 投票:0回答:1

我知道这种问题可能已经问过几次了,但是它们都与laravel有关,在我的情况下,这是没有框架的原始php。

我有一个可以从用户那里收集表单并将其保存到数据库中的表单,但是我不断收到有关MYSQL Error: SQLSTATE[HY000] [2002] No such file or directory的错误。这是我的数据库配置文件和包含它的文件:

// Database config 
<?php

$host = 'localhost';
$user = 'admin';
$password = '123456';
$db_name = 'nairobi';

$dsn = 'mysql:host='.$host.';dbname='.$db_name;
$options = [ 
  PDO::ATTR_PERSISTENT => true,
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];

    // Create a new PDO instance 
    try {
      $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
      print "Error: " . $e->getMessage() . "</br>";
      die();
    }

?>
<?php 
require "./library/Database.php";

if (isset($_POST['submit'])) {

  $first_name = $_POST['first_name'];
  $last_name = $_POST['last_name'];
  $email = $_POST['email'];

  $sql = 'INSERT INTO TABLE members(first_name, last_name, email) 
  VALUES (:first_name, :last_name, :email)';
  $stmt = $dbh->prepare($sql);
  $stmt_value = [
    ':first_name' => $first_name, 
    ':last_name' => $last_name, 
    ':email'=>$email
  ];
  $stmt->execute($stmt_value);
}


?>

是,我知道处理表单的脚本不安全。

php mysql
1个回答
0
投票

首先像这样更改您的连接:

$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 {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

现在输入您的密码!您正在使用prepare语句,这会使您的代码足够安全。

if (isset($_POST['submit'])) {

  $first_name = $_POST['first_name'];
  $last_name = $_POST['last_name'];
  $email = $_POST['email'];
//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) VALUES (:first_name, :last_name, :email)';
  $stmt = $dbh->prepare($sql);
  $stmt->execute([$first_name, $last_name, $email]);
//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.
}

最终确保您创建了一个数据库。确保您在数据库中创建了表调用成员。

如果您已完成所有操作,则您的代码将毫无问题地工作。

<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="psw"><b>last_name</b></label>
    <input type="text" placeholder="Enter last_name" name="last_name" required>

    <label for="psw"><b>email</b></label>
    <input type="email" placeholder="Enter email" name="email" required>

    <button type="submit">Login</button>
  </div>
</form>
© www.soinside.com 2019 - 2024. All rights reserved.