来自数据库管理员Stack Exchange的

This question was migrated,因为可以在Stack Overflow上进行回答。
                            Migrated 5天前。
                        
                    
                
                            
                    
在Visual Studio Code中,我正在创建一个网站。我拥有的HTML页面具有获取用户数据的形式:

<form action="Data.php" style="position: fixed; top: 60px; left: 5px;" method="POST">
  <fieldset>
    <legend>Create Account</legend>
    Username: <br>
    <input type="text" name="username">
    <br>
    Email:<br>
    <input type="text" name="email">
    <br>
    Password:<br>
    <input type="text" name="password">
    <br><br>
    <input type="submit" name ="Submit" value="Create">
    </fieldset>
</form>


然后将其发送到名为Data.php的php文件:

<?php
if(isset($_POST['Submit'])){
    $host = "localhost:3306";
    $username = "Arthos";
    $password = "Pancake101!";
    $database = "userinfo";

    $user = $_POST['username'];
    $email = $_POST['email'];
    $pass = $_POST['password'];

    $connect = mysqli_connect($host, $username, $password, $database);
    $query = "INSERT INTO 'users'('username', 'email', 'password') VALUES ("'.$user.'", "'.$email.'", "'.$pass.'")";

    $result = mysqli_query($connect,$query);

    mysqli_close($connect);
}
?>


我不知道如何在vs代码中查看php echo或mysql错误。我正在使用基本的html项目,并且它们未出现在调试控制台中。如果需要,我可以发送数据库的外观。

编辑:
具有PDO的新PHP代码,仍然无法正常工作:

<?php
echo "Made it!";
$dsn = "mysql:host=localhost;dbname=userinfo;charset=utf8mb4";
  $options = [
    PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
  ];
  try {
      $pdo = new PDO($dsn, "username", "password", $options);
      $stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
      $stmt->execute([$_POST['username'], $_POST['email'], $_POST['password']]);
      $stmt = null;
  } catch (Exception $e) {
      error_log($e->getMessage());
      exit('Something weird happened'); //something a user can understand
  }
    ?>


编辑2:
我得到了要运行的php文件。我不得不弄乱一些奇怪的Visual Studio代码,而且显然找不到我的php.exe文件,所以现在可以正常工作了。
但是现在我得到了错误:


  我的php文件“未找到驱动程序”,所以我现在必须调查一下。
  我没有对上面的Data.php副本中可以看到的代码进行任何更改。


对于最后一个问题,我需要取消注释php.ini中的一行。如果您有此问题,请进入php.ini文件,对其进行编辑,以在之前消除分号:
 ; extension=pdo_mysql
确实应该是:extension=pdo_mysql

最佳答案

好 ..


表名和列名不属于单引号,因为mysql用于标记字符串数据和类似名称(如datetime)。您应该使用backticks来封装表名和列名。



  表`tableName` ....



请仔细阅读sql-injection-您手动构建查询字符串的方法会引发sql-injection(在您的情况下,没有让恶意用户在密码字段中键入SQL命令的方式……他只是键入“' );删除表用户;-“(不带双引号),并且您的数据库以..为例中断。https://www.w3schools.com/sql/sql_injection.asp
明文密码...请使用完善的哈希方法,如sha-256


您可能想使用mysqli提供的准备好的(sql-)语句..但我建议您花些时间学习PDO

除了您的调试问题以外,Visual Studio不仅提供调试..,还提供输出视图...您应该可以在其中看到echo / var_dump ...
如果您的数据库操作失败,则还应该在PHP中使用try-catch异常处理-从创建数据库连接(如果db-server关闭时可能会失败)开始,直到由于语法错误(如您的情况)而导致查询失败。 。如果那确实是您使用过的代码,则由于提到的提示1而中断,如果您要指出表和列的名称..请使用`(反引号)

07-25 22:50
查看更多