我正在创建一个随机用户ID,但是我想检查一下ID是否已被使用(非常不可能,但有可能存在),但不知怎的,这不起作用。当我查看数据库时,account_id
字段中没有随机字符串。我是否以错误的方式调用函数?
function genRandomString() {
$length = 40;
$characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters))];
}
return $string;
}
function createID() {
$cl_id = 'h_u_'.genRandomString();
}
createID();
$sql_query="SELECT * FROM accounts WHERE account_id = :cl_id";
$statement = $conn->prepare($sql_query);
$statement->bindParam(':cl_id', $cl_id, PDO::PARAM_STR);
if ($statement->execute() && $row = $statement->fetch())
{
createID();
}
$conn->exec("INSERT INTO accounts SET
account_id='$cl_id' ,
name='$_POST[name]' ,
email='$_POST[email]' ");
答案 0 :(得分:2)
$ cl_id是createID()函数中的局部变量,您需要将值返回到全局代码...
function createID() {
return $cl_id = 'h_u_'.genRandomString();
}
您需要在主代码中检查$ id
$id = createID();
$sql_query="SELECT * FROM accounts WHERE account_id = '".$cl_id."'";
$statement = $conn->prepare($sql_query);
答案 1 :(得分:1)
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 Injections。如果您的数据库库支持服务器端预处理语句,那么您应该使用它们,并且您可以感到安全,因为数据与查询语法是分开的。如果您使用PHP与MySQL,则情况就是如此。
如果您没有使用服务器端预处理语句,则应使用mysql_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');
}