【问题标题】:PHP->MySQL, ERROR: "Trying to get property of non-object"PHP-> MySQL,错误:“试图获取非对象的属性”
【发布时间】:2012-08-11 09:14:37
【问题描述】:

我对 php/sql 还很陌生,但我对此做了很多研究,直到我决定寻求帮助。

基本上我试图将新的用户名/电子邮件/密码/盐插入 MySQL5 数据库。这是我的测试 register.php,只有一个回声:

include 'dbcxn.php';

$usr = $_POST['user'];
$mail = $_POST['mail'];
$pwd = $_POST['p'];
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
$password = hash('sha512', $pwd.$random_salt);

$insert_stmt = DB::cxn()->prepare("INSERT INTO members (username, email, password, salt) VALUES ($usr, $mail, $password, $random_salt)");
echo $insert_stmt->param_count." parameters\n";

我尝试只使用“$insert_stmt = $mysqli->prepare”,同样的事情发生了。所以我做了类数据库。如果有帮助,这是我的 dbcxn.php:

define("HOST", "");
define("USER", "");
define("PASSWORD", "");
define("DATABASE", "");
define("PORT", "");

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE, PORT);

class DB {
private static $mysqls;
private function __construct(){}

static function cxn() {
    if( !self::$mysqls ) {
        self::$mysqls = new mysqli(HOST, USER, PASSWORD, DATABASE, PORT);
    }
    return self::$mysqls;
}
}

不知道还有什么可以尝试的,需要睡觉:)。提前感谢您的任何建议。

【问题讨论】:

  • 错误具体出现在哪里?
  • 恭喜您使用了加盐和散列密码,但您的代码容易受到 SQL 注入的攻击。您真的应该parameterise your variables,这样他们就不会获得 SQL 评估。如果你不知道我在说什么,请阅读Bobby Tables 的故事。
  • 谢谢,我会研究的。
  • 如果我错了,请纠正我,但是在使用准备好的状态(下面的代码)后,就像它应该使用的那样,它不再容易被注入,对吧?

标签: php mysqli


【解决方案1】:

您的主要问题是您的字符串根本没有转义。

mysqli::prepare() 用于准备好的查询。为了使这项工作成功,您应该将查询更改为:

$insert_stmt = DB::cxn()->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)");
$insert_stmt->bind_param('ssss', $usr, $mail, $password, $random_salt);
$insert_stmt->execute();

您可以在http://www.php.net/manual/en/mysqli-stmt.bind-param.php 上阅读 bind_param 以获取更多信息,以及对第一个参数的解释('s' 表示一个字符串值,这里有 4 个,因为您要插入 4 个字符串值)。

【讨论】:

  • 猜猜看,还没睡。同时我发现了 SQL 语法错误,然后检查了你的代码,你是绝对正确的。我根本没有得到prepare/bind_param,但现在我得到了。谢谢!我仍然有一些哈希问题,因为我可以注册但之后无法登录。但那是另一个故事。再次感谢两者。
  • 很好,插入工作。对于散列问题,您确定数据库中的密码和盐列都足够宽,并且您正在执行相同的散列算法来检查用户提供的密码+盐吗?
  • 不,这毕竟不是哈希问题。我只是在数据库中有一封重复的电子邮件,因此出现了错误。双重哈希现在工作正常。接下来我必须处理“检查现有用户”代码:)
  • 你可以在你的mysql数据库中添加一个唯一的约束,通过:ALTER TABLE membersADD UNIQUE(email);
  • 有效!谢谢...很简单。你能推荐任何关于如何解释和回显 SQL 错误的读物吗?比如那个,当有人试图注册已经注册的电子邮件时。
【解决方案2】:

您的 SQL 有语法错误。你得到的是这样的: 插入成员(用户名、电子邮件、密码、盐)值(用户名、test@test.test、mypassword、lkjlk21j3lkjsdclksdmfl3i4)

你可能想要这个:

INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2013-04-11
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多