通过准备好的语句与INSERT INTO PDO

在我通过PHP的丛林冒险:数据对象我遇到了通过预处理语句执行MySQL查询的问题。

请注意以下代码:

$dbhost = "localhost"; $dbname = "pdo"; $dbusername = "root"; $dbpassword = "845625"; $link = new PDO("mysql:host=$dbhost;dbname=$dbname","$dbusername","$dbpassword"); $statement = $link->prepare("INSERT INTO testtable(name, lastname, age) VALUES('Bob','Desaunois','18')"); $statement->execute(); 

这是我,我想在我的数据库。 不过,我一直迷路在..好吧..我不知道! 根据谷歌这是做到这一点,虽然我的数据库保持空白。

我在这里错过了什么? 因为我已经被困了一个小时了,想继续学习PDO!

你应该像这样使用它

 <?php $dbhost = "localhost"; $dbname = "pdo"; $dbusername = "root"; $dbpassword = "845625"; $link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword); $statement = $link->prepare("INSERT INTO testtable(name, lastname, age) VALUES(:fname, :sname, :age)"); $statement->execute(array( "fname" => "Bob", "sname" => "Desaunois", "age" => "18" )); 

已准备好的语句用于清理input,并且可以使用:foo在SQL中没有任何单引号来绑定variables,然后在execute()函数中传入您在SQL语句。

你也可以用? 而不是:foo然后传入一个只有值的数组来input像这样;

 $statement = $link->prepare("INSERT INTO testtable(name, lastname, age) VALUES(?, ?, ?)"); $statement->execute(array("Bob", "Desaunois", "18")); 

两种方式都有其优点和缺点。 我个人更喜欢绑定参数名称,因为它更容易阅读。

我刚刚重写了以下代码:

  $dbhost = "localhost"; $dbname = "pdo"; $dbusername = "root"; $dbpassword = "845625"; $link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword); $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $statement = $link->prepare("INSERT INTO testtable(name, lastname, age) VALUES(?,?,?)"); $statement->execute(array("Bob","Desaunois",18)); 

而且现在似乎工作。 但。 如果我故意导致错误发生,它不会说有什么。 代码工作,但仍然; 我应该遇到更多的错误,我不知道为什么。

请在代码中添加try catch,这样就可以确保没有exception。

 try { $hostname = "servername"; $dbname = "dbname"; $username = "username"; $pw = "password"; $pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw"); } catch (PDOException $e) { echo "Failed to get DB handle: " . $e->getMessage() . "\n"; exit; } 

感谢Novocaine88的答案,使用try catch循环,我成功地收到了一个错误信息,当我造成一个。

  <?php $dbhost = "localhost"; $dbname = "pdo"; $dbusername = "root"; $dbpassword = "845625"; $link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword); $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $statement = $link->prepare("INERT INTO testtable(name, lastname, age) VALUES(?,?,?)"); $statement->execute(array("Bob","Desaunois",18)); } catch(PDOException $e) { echo $e->getMessage(); } ?> 

在下面的代码中,而不是INSERT INTO它说INERT。

这是我得到的错误。

SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误; 检查与您的MariaDB服务器版本相对应的手册,在“INERT INTO testtable(name,lastname,age)”附近使用正确的语法VALUES('Bob','Desaunoi'at line 1

当我“解决”这个问题的时候,它就是应该的。 非常感谢大家!