-1

我过去一直在使用 mysql 和 mysqli,但是我正在开始一个新项目,所以想用 PDO-mysql 回到 OOP .. 但是,它不想工作:

$dbh = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
if(isset($_POST["name"]) && isset($_POST["password"]))
    {

        $pwdHasher = new PasswordHash(8, FALSE);
        $hash = $pwdHasher->HashPassword($_POST["password"]);
        //$insert = $dbh->prepare('insert into users (username,password) values ("?","?")');
        $insert = $pdo->prepare("insert into users (username,password) values (?,?)");      
        $insert->bindParam(1,$_POST["name"]);
        $insert->bindParam(2,$hash);
        $insert->execute();
        echo "Registration Success!";
    }

编辑:如果我将代码从注释行更改为非注释行(即单引号到双引号),则上面的代码有效但是,这在以后不起作用:

$query = $pdo->prepare("select * from users where username = ?");
$query->bindParam(1,$_POST["name"]);
$result = $query->execute()
4

3 回答 3

1

好的,您已经找到了第一个问题的答案。
对于第二个,它将是

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

连接后立即调用。
它会告诉你你的查询出了什么问题。

error_reporting(E_ALL); 

也总是有助于解决诸如拼写错误的变量之类的错误(例如,$pdo 不是 $dbh)

于 2013-01-29T12:31:28.963 回答
-1

如果你想用?对于占位符,您应该将数组发送到与问号位置匹配的执行方法。$insert->execute(array('value1', 'value2'));

但是,您可以使用命名占位符.. WHERE x = :myxvalue并使用$insert->bindValue(':myxvalue', 'thevalue', PDO::PARAM_STR);

bindParam另外,请看一下和之间的区别bindValue

于 2013-01-29T12:25:18.237 回答
-1

这个问题的答案很简单也很尴尬:我需要将准备好的sql语句周围的单引号更改为双引号(并删除'?'标记所在的双引号。更改:

$insert = $dbh->prepare('insert into users (username,password) values ("?","?")');

$insert = $dbh->prepare("insert into users (username,password) values (?,?)");

一切正常。

于 2013-01-29T12:43:04.520 回答