次のコードを実行して、最初の試行でテーブルに挿入することができました。次に、PHPMyAdminでその行を削除して、コードをさらにテストしました。また、1回目の試行で削除されなかったことにも気づきました。数回試した後でのみ。これは、クエリが完了した後、$pdoHandleをNULLに設定しなかったことが原因である可能性があります。
その後、残念ながら、その後の実行で新しい行を挿入できませんでした。入力値を変更しようとしても、新しい行を挿入できませんでした。以下は私のPHPコードです。
public function CreateNewCustomer($userId,$password,$name,$email)
{
$userId = filter_var($userId,FILTER_SANITIZE_STRING);
$password = filter_var($password,FILTER_SANITIZE_STRING);
$password = sha1($password);
$name = filter_var($name,FILTER_SANITIZE_STRING);
$email = filter_var($email,FILTER_SANITIZE_EMAIL);
do{
$customerId = hexdec(bin2hex(openssl_random_pseudo_bytes(4,$isStrong)));
echo $customerId;
$result = $this->connObject->exec("SELECT COUNT(id) FROM customer_tbl WHERE id=$customerId");
var_dump($result);
}while($result>0);
$statement = $this->connObject->prepare("INSERT INTO customer_tbl (id,name,email) VALUES ($customerId,:name,:email)");
$result = $statement->execute(array(':name'=>$name,':email'=>$email ));
var_dump($result);
$statement = $this->connObject->prepare("INSERT INTO login_tbl (username,password,customer_id) VALUES (:userName,PASSWORD(:password),$customerId)");
$result = $statement->execute(array(':userName'=>$userId,':password'=>$password ));
var_dump($result);
}
上記のメソッドにアクセスするには、次のコードを使用しました。
function Test($userName,$password,$name,$email)
{
try
{
$dbConnect = new DbConnect();
$pdoHandle = $dbConnect->Connect();
$userAccess = new UserAccess($pdoHandle);
$userAccess->CreateNewCustomer($userName,$password,$name,$email);
}
catch(PDOException $e)
{
$pdoHandle = null;
var_dump($e);
}
$pdoHandle = null;
}
Test('tester','password','TestX','test@example.com');
結果のvar_dumpは常にfalseです。
コードに問題がありますか、それともデータベースに問題がありますか?
更新/解決策:
PDO :: exec()に関するPHPドキュメントを読みましたが、ユーザーが投稿したメモの1つに、SELECTステートメント(上記ではカウント値のみが返される場合でも)および行を返す可能性のあるステートメントは使用できないと記載されています。 。PDO :: exec()の戻り値は、影響を受ける行(整数)の数であるため、PDOStatement :: closeCursor()を使用して解決することはできません。PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY => trueを設定しても、機能しません。
したがって、SELECTにはPDO :: exec()を使用しないでください。以下のように、コードをPDO :: query()に変更しました。
do{
$customerId = hexdec(bin2hex(openssl_random_pseudo_bytes(4,$isStrong)));
$statement = $this->connObject->query("SELECT COUNT(id) FROM customer_tbl WHERE id=$customerId");
$statement->execute();
}while($statement->fetchColumn(0)>0);
これが同様の問題の解決策を探している人に役立つことを願っています。また、ユーザーの貢献を含め、最初にPHPドキュメントを読むことを忘れないでください。