【问题标题】:PDO Query Check for Duplicate Username Upon Submission提交时 PDO 查询检查重复用户名
【发布时间】:2011-08-04 10:21:58
【问题描述】:

错误:解析错误:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,预计第 7 行有 T_STRING 或 T_VARIABLE 或 T_NUM_STRING

尝试使用PDO 建立此连接并形成查询,在按下提交后输入字段时检查用户名是否存在。

HTML:

<form action="inc/check_regUsr.php" method="post" id="userLogon">
    <div class="field required">
        Username: <input type="text" name="regduser" tabindex="1" /><br />
        </div>
        <div class="field required">
        Password: <input type="password" name="regdpass" tabindex="2" /><br />
        </div>
        <input type="submit" name="submitUser" />
</form>

PHP

<?php
#Login Details
require_once('dbcred.php');
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);

#Check for Existing User
$q = $conn->query("SELECT uname FROM Student WHERE $_POST['regduser'] = uname");
$stmt = $conn->prepare($q);
$r->execute($q);
if($q($r)>= 1){ #if there are 1 or more users with enter username, deny.
echo "Sorry, username already exists";
}
else{
echo "Success";
}

?>

【问题讨论】:

  • 请阅读 SQL 注入。

标签: php mysql pdo


【解决方案1】:

将您的复杂变量括在双引号字符串中的{} 中:

$q = $conn->query("SELECT uname FROM Student WHERE {$_POST['regduser']} = uname");
// -----------------------------------------------^^^^^^^^^^^^^^^^^^^^^

看起来您的 SQL WHERE 子句是向后的,并且缺少引号。应该是

WHERE uname = '{$_POST['regduser']}'

您还有另一个问题,您首先调用$conn-&gt;query(),然后尝试创建准备好的语句。

调用query() 是不必要的,实际上很危险。而是使用 ? 占位符创建一个适当的准备好的语句:

$stmt = $conn->prepare("SELECT uname FROM Student WHERE uname = ?");
$stmt->bindParam(1, $_POST['regduser'], PDO::PARAM_STR);    
$stmt->execute();

【讨论】:

    【解决方案2】:

    由于您已经在使用 PDO,您不妨利用参数功能,该功能可以很好地防止 SQL 注入攻击。

    $conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
    
    $stmt = $conn->prepare("SELECT uname FROM Student WHERE ? = uname");
    $params = array($_POST['regduser']);
    $stmt->execute($params);
    if ($stmt->rowCount() > 0) {
    
    echo "Sorry, username already exists";
    }
    else{
    echo "Success";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2018-10-31
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多