【问题标题】:Writing to Database with MySQLI使用 MySQLI 写入数据库
【发布时间】:2016-01-24 21:02:21
【问题描述】:

我正在为我的一个朋友做一个项目,我们想在 mysqli 中编写我们的数据库调用。我是新手,我只使用了我知道此时已过时的 mysql 命令。我不断收到Call to a member function query() on a non-object on line 30,这是我的if ($mysqli->query($sql)) { 命令。谁能指出我正确的方向?我已经尝试在 W3 学校中查找它。这是我的完整代码:

// If the form is submitted, INSERT into table.
if (isset($_POST["submit"])) {

    // Define $username and $password.
    $username = $_POST['user_username'];
    $password = $_POST['user_password'];

    // Protect them from MySQL injection.
    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = mysqli_real_escape_string($db, $username);
    $password = mysqli_real_escape_string($db, $password);
    $password = md5($password);

    // Run some queries.
        if ($_FILES["user_image"]["error"] > 0) {

            //Bad Output for form results red text
            echo "<font size = '5'><font color=\"#e31919\">Error: NO CHOSEN FILE <br />";
            echo"<p><font size = '5'><font color=\"#e31919\">INSERT TO DATABASE FAILED";

        } else {

            move_uploaded_file($_FILES["user_image"]["tmp_name"],"uploads/" . $_FILES["user_image"]);
            $file="uploads/".$_FILES["user_image"];
            $image_title = addslashes($_REQUEST['user_image']);
            $sql="INSERT INTO users (user_fname, user_lname, user_image, user_phone, user_cell, user_email, user_username, user_password) VALUES ('$_POST[user_fname]', '$_POST[user_lname]', '$_POST[user_image]', '$_POST[user_phone]', '$_POST[user_cell]', '$_POST[user_email]', '$username', '$password')";
            if ($mysqli->query($sql)) {
                die('Error: ' . $mysqli->error);
            }

            //Good Output for form results green text   
            echo '
             <form enctype="multipart/form-data" action="insert_image.php" method="post" name="changer">
                <div style="padding:10px;">
                    <h2 style="font-size: 28px;">Success!</h2>
                    <p style="font-size: 18px;">Your file has been successfully uploaded!</p>
                </div>     
            </form>';
        }
}

谢谢!

【问题讨论】:

  • $mysqli 未在此代码中的任何位置定义
  • 尝试使用$mysqli->real_query($query);
  • 请不要使用 MD5 散列密码。 MD5 对于密码来说是快速且不安全的。请使用密码哈希 API。如果您没有 PHP 5.5,可以使用 PHP 5.3+ 的兼容性脚本。
  • 您需要向我们展示您在此处连接的位置/方式。到目前为止,以下所有答案都是错误的。
  • @Fred-ii- 好吧,他确实使用转义并将$db 作为 mysqli 实例传递,所以他们没有错。他们处于一种状态,他们的答案要么是错的,要么是对的,或者两者都是。

标签: php mysql mysqli


【解决方案1】:

这是您的 VALUES 中的非对象 $_POST[user_image],您在其他任何地方都使用了 $_FILES["user_image"],但在您发布的代码中没有任何输入。我们在这里处理的是文件而不是文本输入。

即:&lt;input type="file" name="user_image"&gt;

  • 只有知道。

另外,您需要使用您真正使用的连接变量,如果它是$db$mysqli,并且如果您成功连接到您的数据库,或者选择了正确的数据库和表。

  • 同样,只有知道。

然后这个:

$image_title = addslashes($_REQUEST['user_image']);

您应该使用$_FILES 而不是$_REQUEST,因为这意味着您可能在未显示的“其他”表单中使用 GET 方法。

参考:

参考资料:

并使用适合您的连接的错误处理。请参阅下面我的编辑

还要确保您要上传到的文件夹具有正确的写入权限。

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:显示错误应该只在暂存阶段完成,而不是在生产阶段。

也可以使用var_dump();,回显和查看您的 HTML 源代码是在调试过程中帮助您的附加工具。


补充说明:

如果您想将该数据作为二进制数据上传到表中,请确保您使用的是正确的类型。

如 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

另一个“只有你知道”

参考:


正如马特在 cmets 中所说:

并且$file="uploads/".$_FILES["user_image"];应该改为$file="uploads/".$_FILES["user_image"]['name'];

"uploads/" . $_FILES["user_image"] 的两个实例更改为"uploads/".$_FILES["user_image"]['name']

move_uploaded_file()上查阅手册:


密码。

我注意到您正在使用 MD5 作为密码散列函数。此功能不再被认为可以安全使用。

使用以下方法之一:

其他链接:

关于列长度的重要旁注:

如果并且当您决定使用password_hash() 或 crypt 时,请务必注意,如果您当前密码列的长度低于 60,则需要将其更改为该长度(或更高)。手册建议长度为 255。

您需要更改列的长度并使用新的哈希重新开始以使其生效。否则,MySQL 将静默失败。


编辑:

看到你的另一个问题:

我注意到 PDO 语法 $row = $stmt-&gt;fetch(PDO::FETCH_ASSOC); 以及您与 mysql_ 函数 $image = mysql_query... 混合的地方。

这告诉我您可能仍在混合使用 MySQL API。如果您的连接是 PDO,那么您不能混合使用这些不同的 API。从连接到查询,您必须使用相同的。

在 Stack 上查阅以下内容:

带有mysql_ 的 PDO - 无效
PDO 与 mysqli_ - 无效
mysql_mysqli_ - 无效

【讨论】:

  • 这不是错误的来源,但您对$_FILES 问题的看法是正确的。
  • @Matt 从他们发布的代码中,是我想出的唯一推论。如果 OP 愿意向我们展示他们的完整代码,我很乐意按照 ;-) 进行编辑
  • 当您尝试对不是对象的变量使用函数时会出现该错误,例如如果我要执行$fghghd-&gt;query("A WORKING QUERY HERE");,也会发生同样的错误。错误将显示相同。
  • @Matt 我刚刚对$image_title = addslashes($_REQUEST['user_image']); 进行了另一次编辑,他们将$_REQUEST 用于应该是$_FILES 的文件。
  • 是的,代码中有很多错误,而不仅仅是他得到的错误:/
【解决方案2】:

您的代码应该全部是面向对象的或全部是函数式的。您可以采用面向对象的方式:

$mysqli = new mysqli('dbhost', 'username', 'password', 'dbname');
// ...
$username = $mysqli->escape_string($username);
$password = $mysqli->escape_string($password);
// ...
$mysqli->query($sql);

或功能方式:

$mysqli = mysqli_connect('dbhost', 'username', 'password', 'dbname');
// ...
$username = mysqli_escape_string($mysqli, $username);
$password = mysqli_escape_string($mysqli, $password);
// ...
mysqli_query($mysqli, $sql);

请注意,从 PHP 7 开始,函数式语法现在已被弃用(我认为,找不到确切的版本)。请参阅mysqli::_construct 的文档以了解正确用法。

同样,mysqli_escape_string()/$mysqli-&gt;escape_string() 现在是
$mysqli-&gt;real_escape_string() 的别名,因此不再需要像旧的mysql 模块那样使用更长的形式。

最后,确保您在代码中实际实例化了$mysqli 变量。即使连接失败,您也没有理由遇到该特定错误。

【讨论】:

  • 这更像是对 OP 的问题/评论,你不同意吗?
  • 您可能是对的,但我的回答根据提供的信息回答了问题。虽然您的回答冗长且来源充分,但它只是切题地解决了实际问题。其他答案试图回应并且完全错误。我认为最好从那里获得一些准确的信息。
  • 并不是说您的信息不正确,如果您没有,我会提出相同的观点。但这些都不能真正解决眼前的问题,即没有正确实例化数据库连接。
  • 我已经更详细地更新了我的回复,因为 OOP 和功能代码的混合绝对是一个问题。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 2016-05-15
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
相关资源
最近更新 更多