如果已经存在PHP则创建新的

时间:2012-12-29 18:03:26

标签: php function insert pdo user-registration

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

2 个答案:

答案 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');
}