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