1. 您错过了在 createID() 中返回 $c_id。将其更改为:
function createID() {
return 'h_u_'.genRandomString();
}
$cl_id = createID();
2. 您可以使用 good olduniqid()
而不是您的 custom genRandomString()
。
这将导致更简单的事情,例如:
function createID() {
return 'h_u_'.uniqid();
}
$cl_id = createID();
3. 您必须将数据库相关代码中的 if 更改为循环(请看下面的示例)
4. 您的插入查询使用未经验证的 $_POST 变量。这很容易发生SQL 注入。如果您的数据库库支持服务器端准备好的语句,您应该使用它们并且您会感到安全,因为数据与查询语法分开。如果您将 PHP 与 MySQL 一起使用,情况就是如此。
如果您没有使用服务器端准备好的语句,您应该通过 usingmysql_real_escape_string()
或类似的方式转义查询中使用的任何 $_POST 数据。在下面的示例中,我假设您将 PHP 与 MySQL 一起使用,这就是我使用准备好的语句的原因。
考虑到所有这些可能会导致完成的脚本如下:
$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');
}