【问题标题】:MySQL error code 0 in PHP? Cannot insert data into database with PHP [closed]PHP中的MySQL错误代码0?无法使用 PHP 将数据插入数据库 [关闭]
【发布时间】:2015-08-30 20:16:05
【问题描述】:

因此尝试将一些来自 PHP 页面的数据插入到我的 SQL 数据库中。这个页面只能通过我自己访问,所以我不担心它被访问或 SQL 可注入等。我的问题是无论我使用什么代码它都不会进入数据库。我试过自己编写代码,使用模板代码,从 php.net 获取等等,都没有成功!

它现在用成功消息重定向我,但数据库中仍然没有任何内容。

代码将放在下面,出于隐私原因,我将编辑我的一些详细信息。

<?php
require connect.php

   // If the values are posted, insert them into the database.
    if (isset($_POST['username']) && isset($_POST['password'])){
        $username = $_POST['username'];
        $isadminB = $_POST['isadmin'];
        $password = $_POST['password'];

        $query = "INSERT INTO `users` (user_name, password, isadmin) VALUES ('$username', '$password', '$isadminB')";
        $result = mysql_query($query);
        if($result){
            $msg = "User Created Successfully.";
        }
    }
    $link = mysql_connect("localhost", "root", "password");
echo mysql_errno($link) . ": " . mysql_error($link). "\n";

echo mysql_errno($link) . ": " . mysql_error($link). "\n"; 是给我错误代码 0 的代码?

根据我上一页的表单代码请求。

<form action="account_create_submit.php" method="post">
Username: <input type="text" name="username" id="username"> <br /><br />
Password: <input type="password" name="password" id="password"> <br /><br />
<span id="isadmin">Is Admin: Yes<input type="radio" name="isadmin" id="1" value="1"> | No<input type="radio" name="isadmin" id="0" value="0"><br /></span>
<span id="submit"><input type="submit" value="Create Account"></span>
</form>

好的,因此更改了表单代码,因此方法现在是 POST。伟大的!所有数据都被正确读取,尽管这不是我的问题,因为即使输入要提交的代码的硬数据也不起作用,至少它已经解决了未来的问题。新的错误代码不再是 0 而是如下:

1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''user_name'、'password'、'isadmin') VALUES ('testZ'、'lol'、'1')' 附近使用正确的语法

连接.php

    <?php
$connection = mysql_connect('localhost', 'root', 'password');
if (!$connection){
    die("Database Connection Failed" . mysql_error());
}
$select_db = mysql_select_db('Default_DB');
if (!$select_db){
    die("Database Selection Failed" . mysql_error());
}

【问题讨论】:

  • 帮自己一个忙,迁移到 PDO,而不是使用 已弃用 mysql_* 函数。
  • 请帮助解决手头的问题。我确信其他用户也可能在使用 MySQL 时遇到类似的问题。而不是仅仅说迁移到 PDO 为什么不提供帮助呢?或者更好地告诉我有关 PDO 的更多详细信息以及我将如何切换以及这将如何提供帮助?
  • 布拉德,我会直截了当地说,但不要个人认为。这是一个糟糕的代码示例。您正在使用已弃用的功能;您以不安全的方式存储密码,您没有对数据进行验证。您在查询后连接到数据库。您的 $msg 价值无处可去。难怪你有问题。请修复此代码。
  • 我并不是说他的代码写得很好,但 mysql 在当时是很好的。让我们停止说使用不推荐使用的函数是糟糕的代码。这就像说 1985-1995 年的计算机很糟糕,因为它们不如今天的计算机。
  • 好的,所以我尝试使用 connection.php 让它工作,并尝试将其硬编码到页面本身中。似乎我越来越幸运硬编码。所以我猜connect.php有大部分问题。现在将添加到 OP @tllewellyn

标签: php mysql sql-insert insert-into


【解决方案1】:

首先,对于那些对password 的列名有误解的人:

当然,这是 MySQL 的“关键字”,而不是“保留”的词;更具体地说,它是一个函数(参见参考文献)。请注意,“函数(关键字)名称”旁边没有 (R):https://dev.mysql.com/doc/refman/5.5/en/keywords.html,因此它作为列名完全有效。

参考:https://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password

只有在使用它以防止它被识别为“功能”时才需要打勾,这在 OP 的情况下显然 不是。 所以,请直截了当地了解您的信息和事实。

更具体地说,如果一个表名为PASSWORD,并且表名和列声明之间没有空格:

即:INSERT INTO PASSWORD(col_a, col_b, col_c) VALUES ('var_a', 'var_b', 'var_c')

这会引发语法错误,因为表名被认为是一个函数。

因此,正确的语法需要读作

INSERT INTO `PASSWORD` (col_a, col_b, col_c) VALUES ('var_a', 'var_b', 'var_c')

(编辑:)回答当前问题;您在连接中使用 $connection,但使用 $link 以及传递给您的查询的缺失 db 变量以及我已经在此处概述的引号/分号进行查询。

如果你想让你的代码运行起来,那就是这样,但我强烈反对它。正如您所说,您正在使用已弃用的 MySQL 库和 MD5。所有不再安全使用的旧技术,也不会在未来的 PHP 版本中得到支持。

您在这里缺少分号 require connect.php 和引号。

应该读作require "connect.php";

你也应该删除这个:

$link = mysql_connect("localhost", "root", "password");
echo mysql_errno($link) . ": " . mysql_error($link). "\n";

您已经在尝试包含连接文件。

在你的连接文件中使用这个:(修改,使用连接变量连接参数)

$connection = mysql_connect('localhost', 'root', 'password');
if (!$connection){
    die("Database Connection Failed" . mysql_error());
}
$select_db = mysql_select_db('Default_DB', $connection);
if (!$select_db){
    die("Database Selection Failed" . mysql_error());
}

并将$connection 作为第二个参数传递给您的查询。

$result = mysql_query($query, $connection);

在打开 PHP 标记后立即将错误报告添加到文件顶部 例如&lt;?php error_reporting(E_ALL); ini_set('display_errors', 1);,然后是你的其余代码,看看它是否产生任何东西。

还将or die(mysql_error()) 添加到mysql_query()。

如果这仍然给您带来困难,您将需要转义您的数据。

即:

$username = mysql_real_escape_string($_POST['username'], $connection);

对其他人也这样做。

使用更安全的方法:(最初发布的答案)

也可以完全重写并使用 mysqli_ 和准备好的语句。

填写您自己的凭据。

旁注:如果该列是int,则您可能必须将最后一个s 替换为i 为$isadminB。

$link = new mysqli('localhost', 'root', 'password', 'demo');
if ($link->connect_errno) {
    throw new Exception($link->connect_error, $link->connect_errno);
}

if (!empty($_POST['username']) && !empty($_POST['password'])){
    $username = $_POST['username'];
    $isadminB = $_POST['isadmin'];
    $password = $_POST['password'];

// now prepare an INSERT statement
    if (!$stmt = $link->prepare('INSERT INTO `users` 
          (`user_name`, `password`, `isadmin`) 
           VALUES (?, ?, ?)')) {
        throw new Exception($link->error, $link->errno);
    }

    // bind parameters
    $stmt->bind_param('sss', $username, $password, $isadminB);

        if (!$stmt->execute()) {
            throw new Exception($stmt->error, $stmt->errno);
        }

    }
    
    else{
        echo "Nothing is set, or something is empty.";
    }

我注意到您可能以纯文本形式存储密码。如果是这种情况,强烈建议不要这样做。

我建议您使用CRYPT_BLOWFISH 或PHP 5.5 的password_hash() 函数。对于 PHP password_hash() compatibility pack。

您还可以使用从 ircmaxell 的答案之一中提取的这个 PDO 示例:

只需使用库。严重地。它们的存在是有原因的。

不要自己做。如果您正在创建自己的盐,您做错了。您应该使用一个为您处理的库。

$dbh = new PDO(...);

$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);

在登录时:

$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
    if (password_verify($_POST['password'], $users[0]->password) {
        // valid login
    } else {
        // invalid password
    }
} else {
    // invalid username
}

【讨论】:

  • 是的,我只是在想是时候放弃并彻底重写了。我当然不会以纯文本形式存储密码哈哈,别担心!我正在使用带有 SALT 的 MD5。是的可能更安全,但这对我自己来说并不是一个大的安全问题,因为该网站不会是一个 LIVE 网站,更像是一个私人项目之类的东西。谢谢,我将重新编写包括您的 sn-p 在内的代码,看看效果如何。将更新结果。
  • Fred -ii-,如果你回答我的话,我会重新投票给你。干杯
  • @tllewellyn 是的,一些他妈的知道passworddev.mysql.com/doc/refman/5.5/en/keywords.html这个词的笨蛋
  • 试图帮助 OP 所花费的时间......不管是谁都是 j@ck***。
  • @BradAndrews 这是迄今为止最好的解释答案,请点击此答案投票数正下方的勾号接受答案!
【解决方案2】:

您正在使用“get”作为表单提交方法。 “post”变量将无法识别。

还有……

您似乎缺少 mysql_query() 函数的第二个参数,它是 MySQL 连接的链接标识符。我假设你已经在 connection.php 中创建了连接。

通常,mysql_query() 函数是

$result = mysql_query($query, $conn);

$conn 已在您的 connection.php 文件中预定义。

【讨论】:

  • 是的,你说得对,我最初重复了之前表格中的所有细节,以确保它们被正确阅读并且一切都很好。那我一定是不小心把它切换到了POST。现在它让我回到一个新的错误。 1064 为 mysql。将新错误添加到 OP!谢谢
  • 任何时候,祝你好运。
【解决方案3】:

password 是 MySQL 中的一个特殊词,可能需要将该词放在引号中,例如 `password`。

【讨论】:

【解决方案4】:

为什么要将表单中的所有信息放在提交链接中?例如:account_create_submit.php?username=myusername&amp;password=mypassword&amp;isadmin=0


我可以看到$username = $_POST['username']; 与您查询字符串中的用户名不匹配。

$query = "INSERT INTOusers(user_name, password, isadmin) VALUES ('$username', '$password', '$isadminB')";

在修复的同时,为什么不将 $isadminB 和 $_POST['isadmin'] 设置为相同。在这两个地方都使用'isadminB'。

检查一下,看看会发生什么!

【讨论】:

  • 谢谢,@Benlevywebdesign 但是 $username = $_POST['username'];正在从最后一页的表单中获取先前提交的数据并将其存储到 $username 变量中。然后查询获取该数据并应该将其存储到数据库中。 user_name 是我的 mysql 数据库中的列名。不是上一页表单上的字段名称?
  • @BradAndrews 你的提交按钮在上一页是什么样子的?
  • 
    
    用户名:

    密码:

    是管理员:是 |否
  • try this = ` ` 标记之间的代码,但不要将其放在您的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2014-09-25
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多