1。createID()で$c_idを返すことができませんでした。次のように変更します。
function createID() {
return 'h_u_'.genRandomString();
}
$cl_id = createID();
2。uniqid()
カスタムの代わりに古き良きものを使用できますgenRandomString()
。
これにより、次のような単純なものになります。
function createID() {
return 'h_u_'.uniqid();
}
$cl_id = createID();
3。データベース関連のコードのifをループに変更する必要があります(以下の私の例を参照してください)
4。挿入クエリは未確認の$_POST変数を使用します。これはSQLインジェクションの傾向が非常に高いです。データベースライブラリがサーバー側のプリペアドステートメントをサポートしている場合は、それらを使用する必要があります。データはクエリ構文とは別に保持されているため、安心できます。MySQLでPHPを使用している場合は、これが当てはまります。
サーバー側のプリペアドステートメントを使用していない場合は、次のようなものを使用して、クエリで使用される$_POSTデータをエスケープする必要がありますmysql_real_escape_string()
。次の例では、MySQLでPHPを使用していると想定しており、プリペアドステートメントを使用しているのはそのためです。
これらすべてを考慮に入れると、次のようなスクリプトが完成する可能性があります。
$sql_query="SELECT * FROM accounts WHERE account_id = :cl_id";
$statement = $conn->prepare($sql_query);
$maxtries = 3; // how many tries to generate a unique id?
for($i = 0; $i < $maxtries; $i++) {
$cl_id = uniqid(); // create a 'unique' id
$statement->bindParam(':cl_id', $cl_id, PDO::PARAM_STR);
if (!$statement->execute()) {
die('db error');
}
$row = $statement->fetch();
if($row) {
continue;
}
break;
}
// if a unique id couldn't get generated even
// after maxtries, then pigs can fly too :)
if($i === $maxtries) {
die('maximum number of tries reached. pigs can fly!');
}
// You should use a prepared statement for the insert to prevent from
// SQL injections as you pass $_POST vars to the query. You should further
// consider to validate email address and the name!
$name = $_POST['name'];
$email = $_POST['email'];
$insert_query = '
INSERT INTO accounts SET
account_id = :account_id,
name = :name,
email = :email';
$insert_statement = $conn->prepare($insert_query);
$insert_statement->bindParam(':account_id', $cl_id, PDO::PARAM_STR);
$insert_statement->bindParam(':name', $name, PDO::PARAM_STR);
$insert_statement->bindParam(':account_id', $email, PDO::PARAM_STR);
if (!$insert_statement->execute()) {
die('db error');
}