1

我正在创建一个随机用户 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]' ");   
4

2 回答 2

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);
于 2012-12-29T18:07:21.093 回答
1

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');
}
于 2012-12-29T18:16:11.537 回答