【问题标题】:Data not inserting into database数据未插入数据库
【发布时间】:2014-04-30 03:14:23
【问题描述】:

所以我的表单将数据发送到我的 php 文件,然后将其输入数据库。这是php后端部分

<?php
 $db = new mysqli('localhost','root','x','app');
 $username = $_POST['username'];

 $db->query("INSERT INTO people (first_name) VALUES ('{$username}'");

?>

但我的问题是,为什么不将username 放入数据库中?

【问题讨论】:

  • 您应该回显$username 值以进行调试。此外,您的查询允许$_POST 值直接插入数据库,这可能会导致 SQL 注入。
  • 使用mysqli_real_escape_string()来避免SQL注入。
  • 您在("INSERT INTO people (first_name) VALUES ('{$username}'") 中缺少一个括号) 更改为:("INSERT INTO people (first_name) VALUES ('{$username}')")
  • 那行得通。发布我猜的答案? @Fred-ii-
  • 那会解决所有的注射问题吗? @努努

标签: php mysql database pdo


【解决方案1】:

您在以下行中缺少括号 )

("INSERT INTO people (first_name) VALUES ('{$username}' ")
                                                       ^ // <= right there

改成:

("INSERT INTO people (first_name) VALUES ('{$username}')")

然而,正如 cmets 中所指出的,当您使用目前的方法时,您对SQL injection 持开放态度。


下面是prepared statement 的示例:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = @mysqli_connect('localhost', 'xxx', 'xxx', 'my_db');

if (!$mysqli) {
    die('Connect Error: ' . mysqli_connect_error());
}

// $username = $_POST['username'];
$username = mysqli_real_escape_string($mysqli,$_POST['username']);

   $sql = ("INSERT INTO people (first_name) VALUES (?)");

    $stmt = $mysqli->prepare($sql) or die("Failed Execution");
    $stmt->bind_param('s', $username);

    $stmt->execute();
    echo $stmt->error;

echo "SUCCESS";

    exit();

另外,在上线之前使用错误报告很重要。


如果你想开始学习 PDO,

这里有一些教程供您研究:


这是一个PDO 示例:

<?php

    $mysql_hostname = 'xxx';
    $mysql_username = 'xxx';
    $mysql_password = 'xxx';
    $mysql_dbname = 'xxx';

    try{

    $db= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password); 

$email = $_POST['email'];
$username = $_POST['username'];

$result_set = $db->prepare("INSERT INTO `yourTable` (`email`, `username`) 

 VALUES (:email, :username)");

$result_set->bindParam(1, $email);
$result_set->bindParam(2, $username);

$result_set->execute(array(':email' => $email, ':username' => $username));

    echo "Data successfully written.";

        return $db;
    }catch(PDOException $e){
        echo $e;
        return false;
    }

?>

PDO 错误处理链接:

【讨论】:

  • 这是一个超级好的答案并且启用了错误报告
  • 谢谢,感谢@user302975 的评论很高兴我能提供帮助。 :)
  • 只有一个问题。对于准备好的语句,我只需要输入用户名,还是只为两者做同样的事情?
  • @user302975 如果您愿意,您可以只使用一个字段并删除username,然后删除$result_set-&gt;bindParam(2, $username);, ':username' =&gt; $username。如果仅使用 username,则应删除任何对 username 的引用。
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多