3
 $stmt = $conn->prepare("INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',:cover,:dateofbirthYear:dateofbirthMonth:dateofbirthDay,NOW(),:sex,:country)");
 $stmt->execute(array(
  ':username'   => $username,
  ':password' => $password,
  ':email'   => $email,
  ':cover' => $cover,
  ':dateofbirthYear'   => $dateofbirthYear,
  ':dateofbirthMonth' => $dateofbirthMonth,
  ':dateofbirthDay'   => $dateofbirthDay,
  ':sex' => $sex,
  ':country'   => $country 
    ));

何らかの理由で、この挿入ステートメントは機能していません。私はPDOに非常に慣れていないので、それについてはあまり知りません。私は何が間違っているのですか?

このステートメントは私にこのエラーを与えます:

致命的なエラー:キャッチされない例外「PDOException」とメッセージ「SQLSTATE [HY093]:無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません」/home/manga/public_html/new/register.php:80スタックトレース:
# 0 /home/manga/public_html/new/register.php(80):PDOStatement-> execute(Array)
#1{main}が/home/manga/public_html/new/register.phpの80行目にスローされます

4

3 に答える 3

7

クエリを間違った方法で準備しました

INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',
:cover,:dateofbirthYear:dateofbirthMonth:dateofbirthDay,NOW(),:sex,:country
     // ^ These need to either single or separated

あなたがしようとしていることのために、あなたはそれをこのようにすることができます

//Prepare the date of birth earlier
$dob = $dateofbirthYear.$dateofbirthMonth.$dateofbirthDay;

//Then pass it as a single $variable

$stmt = $conn->prepare("INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',:cover,:dob,NOW(),:sex,:country)");
 $stmt->execute(array(
  ':username'   => $username,
  ':password' => $password,
  ':email'   => $email,
  ':cover' => $cover,
  ':dob'   => $dob, // <-- Problem solved
  ':sex' => $sex,
  ':country'   => $country 
    ));
 // Then it will execute
于 2013-03-09T22:42:54.883 に答える
2

正確なエラーメッセージは次のとおりです。

SQLSTATE [HY093]:無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません

これは、渡したパラメーターの数/名前(array()in )がSQLクエリexecuteにあるパラメーターの数/名前と一致しないことを意味します。prepare()

それを含む他の質問と比較すると、SQLSTATE[HY093]大きくてフォーマットが悪く、読みにくいコードに関連していることがよくあります。それは数えるのを難しくします。そして、あなたは何かを見落としていて、それからエラーが起こりました。

修正して完了します。たとえば、3つの名前から1つのパラメータを作成することはできません。

,:dateofbirthYear:dateofbirthMonth:dateofbirthDay,

代わりに、誕生日に1つのパラメーターを渡すだけです。

, :dateofbirth, 

コードをもう少し読みやすくすることもできます。

$stmt = $conn->prepare(
    "INSERT INTO user
     VALUES (
        '', :username, md5(:password), '', 1, '', '', :email, '', 0, 0, '',
        :cover, :dateofbirth, NOW(), :sex, :country
     )"
);
$stmt->execute(array(
    ':username'    => $username,
    ':password'    => $password,
    ':email'       => $email,
    ':cover'       => $cover,
    ':dateofbirth' => $dateofbirthYear . $dateofbirthMonth . $dateofbirthDay,
    ':sex'         => $sex,
    ':country'     => $country
));

そして、パスワードハッシュにセキュリティ上の問題があります。

md5(:password)

代わりに、適切なパスワードハッシュを実行してください。安全なパスワードハッシュに関するPHPFAQを参照してください。

于 2013-03-09T22:39:10.930 に答える
-2

準備されたクエリを修正しました:

$stmt = $conn->prepare("INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',:cover,:dateofbirthYear,:dateofbirthMonth:,dateofbirthDay,NOW(),:sex,:country)");
//:dateofbirthYear,:dateofbirthMonth:,dateofbirthDay place holders are seprated 

$stmt->execute(array(
 ':username'   => $username,
  ':password' => $password,
  ':email'   => $email,
  ':cover' => $cover,
  ':dateofbirthYear'   => $dateofbirthYear,
  ':dateofbirthMonth' => $dateofbirthMonth,
  ':dateofbirthDay'   => $dateofbirthDay,
  ':sex' => $sex,
  ':country'   => $country 
));
于 2017-06-24T19:53:02.627 に答える