【问题标题】:How to insert data into MySQL using MySQLi?如何使用 MySQLi 将数据插入 MySQL?
【发布时间】:2014-07-26 19:36:45
【问题描述】:

我是使用 MySQLi 的新手。我尝试使用 MySQLi 在我的数据库中插入数据。但不起作用。可能是哪里出错了?

echo 'connected';
$con = mysqli_connect("localhost",$username,$password,$database);

// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// mysqli_select_db($con,"kraus");
$firstname = $_POST['uname'];
$lastname =  $_POST['address'];
$age = $_POST['pass'];
$sql = "INSERT INTO registration('uname', 'address', 'password') VALUES ('$firstname', '$lastname', '$age')";
mysqli_query($con,$sql);
echo "1 record added";


mysqli_close($con);

【问题讨论】:

  • 想想“引号”(我是否需要它们,我应该使用它们,以及在哪里使用?)。然后,删除它们。
  • ...('uname', 'address', 'password') - 但是,您将接受 sql 注入(以多种方式)。请注意。
  • 从列名中删除单引号
  • 您也没有检查错误。在这里,将错误报告添加到文件顶部error_reporting(E_ALL); ini_set('display_errors', 1); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 这是一个“自我修复”提示。 ;-)
  • 是的,然后我读到了这个 - 完全错过了它所以删除了答案......哇!

标签: php mysql sql database mysqli


【解决方案1】:

为什么这条线被注释掉了?您正在选择 mysqli_connect("localhost","root","root","kraus") 中的数据库,但它为什么存在是没有意义的:

// mysqli_select_db($con,"kraus");

你不应该这样评论吗?

mysqli_select_db($con,"kraus");

此外,registration(…) 中的字段以及字段周围的引号之间没有空格:

$sql = "INSERT INTO registration('uname', 'address', 'password') VALUES ('$firstname', '$lastname', '$age')";

应该如下所示,在表名和字段之间添加一个空格。而且由于您的字段名称不应该有引号,所以最终查询应该是这样的:

$sql = "INSERT INTO registration (uname, address, password) VALUES ('$firstname', '$lastname', '$age')";

或者可能有这样的反勾号:

$sql = "INSERT INTO registration (`uname`, `address`, `password`) VALUES ('$firstname', '$lastname', '$age')";

另外,你真的应该像这样重构和清理你的整个代码库:

// Set the connection or die returning an error.
$con = mysqli_connect("localhost","root","root","kraus") or die(mysqli_connect_errno());

echo 'connected';

// Select the database.
// mysqli_select_db($con, "kraus");

$post_array = array('uname','address','pass');
foreach ($post_array as $post_key => $post_value) {
   $$post_key = isset($_POST[$post_value]) && !empty($_POST[$post_value]) ? $_POST[$post_value] : null;
}

// Set the query.
$sql = "INSERT INTO registration (uname, address, password) VALUES (?, ?, ?)";

// Bind the params.
mysqli_stmt_bind_param($sql, 'sss', $uname, $address, $pass);

// Run the query.
$result = mysqli_query($con, $sql) or die(mysqli_connect_errno());

// Free the result set.
mysqli_free_result($result);

// Close the connection.
mysqli_close($con);

echo "1 record added";

注意我是如何使用mysqli_stmt_bind_param 并设置$_POST 值数组并在其中滚动的。做这两个基本的事情至少会在输入数据进入数据库之前对其进行一些基本的验证。

【讨论】:

  • ('uname', 'address', 'password') 还在里面 Jake ;-) 这是无效的 ('?', '?', '?') 加上 mysql_error 和空格 "INSERT INTO registration(?
  • @Fred-ii- 感谢您的检查!艰难的一天。生病回家。所以尽我所能!
【解决方案2】:

您在查询中的列名周围有引号。也许您打算改用反引号:

(`uname1`, `address`,...)

您也容易受到 sql 注入的影响。查看mysqli prepared statements

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2022-06-23
    • 2016-05-15
    • 2015-02-27
    相关资源
    最近更新 更多