嘿,整晚都在弄乱这个,只是想知道是否有人能注意到我的代码存在任何缺陷?在我使用过时的sql连接字符串之前我被告知所以我已经更新了。反馈会很棒!
<?php
if ( empty( $_POST ) ){
?>
<form method="post" action="">
<div class="form-group">
<label>Full Name:</label>
<input class="form-control" type="text" name="sub_name" />
<br>
<label>Email:</label>
<input class="form-control" type="text" name="sub_email" />
<div class="pull-right">
<input class="btn btn-success" type="submit" value="Subscribe" />
</div>
</div>
</form>
<?php
} else {
try {
$db = new PDO( 'mysql:host=localhost;dbname=test', $subsc_username, $subsc_password );
$form = $_POST;
$subsc_name = $form[ 'sub_name' ];
$subsc_email = $form[ 'sub_email' ];
$sql = "INSERT INTO subscribers (
subsc_name, subsc_email )
VALUES (
$subsc_name, $subsc_email )";
$query = $db->prepare( $sql );
$query->execute( array( 'subsc_name'=>$subsc_name, 'subsc_email'=>$subsc_email, ) );
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
?>
答案 0 :(得分:1)
您尝试绑定execute()
中的值,但直接插入变量。
你的数组末尾有一个无用的,
。
此外,您应该确定您没有使用模拟语句。
你应该改变这个:
$sql = "INSERT INTO subscribers (
subsc_name, subsc_email )
VALUES (
:subsc_name, :subsc_email )";
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$query = $db->prepare( $sql );
$query->execute( array( ':subsc_name'=>$subsc_name, ':subsc_email'=>$subsc_email ) );
答案 1 :(得分:1)
您在准备好的声明中没有使用占位符。正确的用法是:
<?php
// $_POST might be empty even if the request is a POST
if ('POST' === $_SERVER['REQUEST_METHOD']) {
try {
$db = new PDO('mysql:host=localhost;dbname=test', $subsc_username, $subsc_password);
// default error mode is to return FALSE
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die($e->getMessage());
}
$subsc_name = $_POST['sub_name'];
$subsc_email = $_POST['sub_email'];
// never put variables directly in your SQL queries
$sql = 'INSERT INTO subscribers (subsc_name, subsc_email) VALUES (:subsc_name, :subsc_email)';
try {
$query = $db->prepare($sql);
$query->execute(array(
':subsc_name' => $subsc_name,
':subsc_email' => $subsc_email,
));
} catch (PDOException $e) {
die($e->getMessage());
}
} else {
echo <<<EOF
<form method="post" action="">
<div class="form-group">
<label>Full Name:</label>
<input class="form-control" type="text" name="sub_name" />
<br>
<label>Email:</label>
<input class="form-control" type="text" name="sub_email" />
<div class="pull-right">
<input class="btn btn-success" type="submit" value="Subscribe" />
</div>
</div>
</form>
EOF;
}
?>
答案 2 :(得分:0)
是的,确实如此。你没有准备模板,你只需要在带有非转义值的$ sql中进行现成的查询。
答案 3 :(得分:0)
如果你查看这一行:
$sql = "INSERT INTO subscribers (
subsc_name, subsc_email )
VALUES (
$subsc_name, $subsc_email )";
尝试了解自己在做什么。您正在使用双qoutes,这意味着实际上解析了变量。所以这一行已经评估为
$sql = "INSERT INTO subscribers (
subsc_name, subsc_email )
VALUES (
VALUE_OF_$subsc_name, VALUE_OF_subsc_email )";
所以是的,它容易受到SQL注入攻击。 如果你使用单引号,那么该行将保留为第一个版本,但它仍然不是PDO如何工作。查看this site以获取有关如何使用它的示例。