PHP-> MySQL,错误:“试图获取非对象的属性”

时间:2012-08-11 09:14:38

标签: php mysqli

我是php / sql的新手,但在我决定寻求帮助之前,我做了很多研究。

基本上我试图在MySQL5 DB中插入新的用户名/电子邮件/密码/ salt。这是我的测试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”,同样的事情发生了。所以我创建了DB类。这是我的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;
}
}

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

2 个答案:

答案 0 :(得分: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个字符串值)。

答案 1 :(得分:0)

您的SQL有语法错误。你得到的是: INSERT INTO成员(用户名,电子邮件,密码,盐)VALUES(用户名,test @ test.test,mypassword,lkjlk21j3lkjsdclksdmfl3i4)

你可能想要这个:

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