1

重複の可能性:
MySQL で重複レコードを見つける

私は、この関数を使用してデータベース内の重複を見つけようとしている初心者です。

function uni($field, $value) {
        $sql= "SELECT * FROM user WHERE ".$field." = '".$value."'";
        $result = $pdo->query($sql);
        $rows = $result->fetchAll(PDO::FETCH_COLUMN, 1);
        return count($rows);
    }

$username = $_POST['username']; 
$result = uni("username", $username);

...固いものに頭をぶつけそうです。何らかの理由でクエリが結果を返さず、その理由がわかりません。

4

2 に答える 2

2

わかりました、それであなたは を使っていますねPDO。ただし、スニペットは依然としてインジェクション攻撃に対して無防備です。まだ生のユーザー入力をクエリに渡しています。SELECT *また、見つかった行数だけが必要な場合は使用しないでください。また、それらをカウントするために完全な結果セットをフェッチしないでください。

function uni($field,$value)
{
    $db = new PDO();//make connection, which you don't seem to do
    //or (not so good approach):
    //global $db;
    //Best approach would be to pass the connection to the function, as an extra argument, though
    $stmt = $db->prepare('SELECT '.$field.' FROM user WHERE '.$field.' = :value');
    if ($stmt->execute(array(':value' => $value)))
    {
        return $stmt->rowCount();
    }
    //query failed, throw errors or something
}

その他の例については、ドキュメントを参照してください。
とにかく、コード全体は次のようになります。

function uni($field,$value,$db)
{
    $stmt = $db->prepare('SELECT '.$field.' FROM user WHERE '.$field.' = :value');
    if ($stmt->execute(array(':value' => $value)))
    {
        return $stmt->rowCount();
    }
    return false;
}
$username = $_POST['username']; 
$result = uni('username', $username,$pdo);//<--pass connection
于 2012-10-10T12:12:38.780 に答える
1

$pdo関数内でオブジェクトへの参照を使用していますが、$pdoオブジェクトが定義されていません。

function uni($field, $value) {
  $sql= "SELECT * FROM user WHERE ".$field." = '".$value."'";
  $result = $pdo->query($sql);
//          ^^ undefined object

  $rows = $result->fetchAll(PDO::FETCH_COLUMN, 1);
  return count($rows);
}

$ pdoを関数に渡すか、グローバルにします。

エラー報告をオンにして、コード内のエラーがどこにあるかを確認できるようにします。

于 2012-10-10T12:03:58.633 に答える