0

私はPHPが初めてで、mysqliの代わりにPDOを試しています。ただし、[送信] をクリックしても、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; ?>
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 に答える