0

我对 PHP 非常陌生,并尝试使用 PDO 而不是 mysqli。但是,当我单击提交时,我无法将名字和姓氏的值输入 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; ?>
4

2 回答 2

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

于 2012-11-17T02:25:57.857 回答
1

您应该将其拆分->query()为 a->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()在将其连接到查询之前对各种字符串变量使用。

于 2012-11-17T02:26:25.977 回答