0

私は、ショッピング カートと、各トランザクションに一意の注文 ID が必要なローカル支払いゲートウェイに取り組んでいます。この ID は、注文の詳細に対してデータベースに保存され、変数として支払いゲートウェイに送信されるはずです。私のジレンマは、ゲートウェイのIPNから応答を受信したときに一致することを確認できるように、変数をゲートウェイに送信する前に一意のIDを生成する方法とそれを保存する方法です。問題の変数を以下に示します。

$reference = $_POST['reference'];//unique order id of the transaction, generated by merchant
4

7 に答える 7

6

Here is how i used to generate the random key, even though its bit lengthy you can achieve unique random key.

$id.time().uniqid(mt_rand(),true)

uniqid() - this will generate the 13 character uniqid

mt_rand() - generates random number by using Mersenne Twister algorithim and is 4 times more fast then rand()

uniqid(mt_rand()) - prefixing the random generate number with uniqueid

uniqid(mt_rand(), true) - to get more strong random i am enabling entropy of uniqid by setting second parameter to 'true'

$id.time().uniqid(mt_rand(), true) - here $id may be userid, productid or any id which you want to choose, time() will generate current unix time stamp, lastly i will append with my uniqid(...)

于 2015-10-13T08:03:34.403 に答える
1

uniqueid() で md5() を使用しないでください。実際にはセキュリティが失われます。md5 値を追加または先頭に追加しても問題ありません。

つまり、 http://www.php.net/manual/en/pdo.lastinsertid.phpに固執して、新しく挿入された ID を取得するだけでなく、「username_」と言うことができるようにプレフィックスパラメーターを設定して uniqueid() を生成します。それはかなりユニークでなければなりません。

于 2013-08-08T09:22:08.930 に答える
1

本当に一意の ID が必要な場合は、私が使用しているコードを次に示します。これは単純に 7 文字の文字列を作成し、データベースに既に存在する場合は -> 100% 一意になるまで新しく再生成します。uniqid() は実際には一意の ID ではありません。独自のプレフィックスを配置してコードと混在させることができますが、uniqid() だけを base64 と md5 と sha1 に配置すると、他に何が一意でないかわかりません。

function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
    $str = '';
    $count = strlen($charset);
    while ($length--) {
        $str .= $charset[mt_rand(0, $count-1)];
    }

    return $str;
}

$unique_id = randString(7);  
while(mysqli_num_rows(mysqli_query($con, "SELECT unique_id FROM table WHERE unique_id = '".mysqli_real_escape_string($con, $unique_id)."'")) > 0) { 
   $unique_id = randString(7);
}
//insert this id into database and use it
于 2013-08-08T09:06:35.327 に答える
0

注文の詳細をテーブルに挿入します。そのテーブルの主キーには、AUTO INCREMENT プロパティが設定されている必要があります。次に、最後に挿入された ID http://php.net/manual/en/function.mysql-insert-id.phpを取得します

于 2013-08-08T08:54:43.340 に答える
0

最もユニークな ID を作成する方法は、現在のタイムスタンプ (time() を使用する UNIX) を組み合わせて、現在のユーザーのユーザー名のようなものを追加および/または先頭に追加することです。この方法では、複製を作成することはほとんど不可能です。最後に挿入された ID を追加することもできます。私の意見では、これら 3 つの組み合わせは単純な方法であり、time() は毎秒変化し、ユーザーがまったく同じ秒に 2 つの注文を追加できる可能性はほとんどないため、重複はほとんど不可能になります。 .

于 2013-08-08T10:22:17.917 に答える
-1

データベースのテーブルに基づいたものですか? AUTO_INCREMENT のある列。これを使用して、PDO で最後の挿入 ID を取得できます: http://www.php.net/manual/en/pdo.lastinsertid.php

または次のようなもの

$reference = sha1(md5(time()));
于 2013-08-08T08:55:30.110 に答える