我是PHP新手并尝试使用PDO而不是mysqli。但是,当我单击提交时,我无法将firstname和lastname的值放入sql数据库中。我错过了什么?
<!DOCTYPE HTML>
<?php
$server = 'localhost';
$user = 'xxxx';
$pass = 'xxxxx';
$db = 'xxxxxx';
try {
$con = new PDO("mysql:host=$server;dbname=$db",$user,$pass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
<html>
<form name="Contact form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
First name: <input type="text" name="firstname"><br />
Last name: <input type="text" name="lastname"><br />
<input type="submit" value="Submit this!" name="submit">
</form>
</html>
<?php
if(isset($_POST['submit'])) {
$sql = $con->query("INSERT INTO names (fname,lname) VALUES (:$_POST[firstname],:$_POST[lastname])");
}
?>
<?php $con = null; ?>
答案 0 :(得分:3)
问题在于这一行:
$sql = $con->query("INSERT INTO names (fname,lname) VALUES (:$_POST[firstname],:$_POST[lastname])");
冒号不应该在那里,应该引用插入的值。最简单(也是最安全,最快)的方法是使用准备好的查询:
$statement = $con->prepare(
'INSERT INTO names (fname,lname)
VALUES (:firstname,:lastname)');
$result = $statement->exec(array(
'firstname' => $_POST['firstname'],
'lastname' => $_POST['lastname']));
另请阅读有关SQL注入的更多信息。您的原始代码存在安全漏洞。见http://php.net/manual/en/security.database.sql-injection.php
答案 1 :(得分:1)
你应该将->query()
分成->prepare
和->execute
调用,以实际利用预准备语句/绑定参数:
$st = $con->prepare("INSERT INTO names (fname,lname) VALUES (:first, :last)");
$result = $st->execute(array("first"=>$_POST["firstname"], "last"=>$_POST["lastname"]));
如果要使用->query()
,则需要在将各种字符串变量连接到查询之前使用$con->quote()
。