0
     $headers  = 'MIME-Version: 1.0' . "\r\n";
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
     $headers .= 'From: contact@email.com';
     $to = $email;
     $subject = "Confirmation";
     $message = "Hi, $username. You're registred in Site. Link for confirmation:     http://site.com/confirm/**".mysql_insert_id()."**";
     mail($to, $subject, $message, $headers);
     $query = mysql_query("insert into usr_users(username, password, email, avator, pin)          values('$username', '$password', '$email', '$img', '$pin')");
     $query2 = mysql_query("insert into usr_confirm(user_name, user_id, active, data) values('$username', '".mysql_insert_id()."', '$active', '$senha')");
     echo"Success!</br>";

2 番目のmysql_insert_id() (9 行目) は正しいです! しかし、最初の mysql_insert_id() (6 行目) は、電子メール ボックスに 0 を返します。

4

2 に答える 2

1

マニュアルによると、最後のステートメントが値を生成しない場合に返されます。mysql_insert_id()0AUTO_INCREMENT

前のクエリが成功した場合に生成された AUTO_INCREMENT カラムの ID。前のクエリが AUTO_INCREMENT 値を生成しない場合は 0、 MySQL 接続が確立されていない場合は FALSE。

レコードを挿入する前に最初にmysql_insert_id()呼び出しを使用しているため、結果は次のようになる必要があります(コード内の別の場所でこの前に呼び出しがない限り、実際には歪んだ結果が得られます)。メール関連の呼び出しを挿入ステートメントの下に移動してみてください。0

// insert the records
$query = mysql_query("insert into usr_users(username, password, email, avator, pin)          values('$username', '$password', '$email', '$img', '$pin')");
$query2 = mysql_query("insert into usr_confirm(user_name, user_id, active, data) values('$username', '".mysql_insert_id()."', '$active', '$senha')");

// send the email
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: contact@email.com';
$to = $email;
$subject = "Confirmation";
$message = "Hi, $username. You're registred in Site. Link for confirmation:     http://site.com/confirm/**".mysql_insert_id()."**";
mail($to, $subject, $message, $headers);
echo"Success!</br>";

この変更後もエラーが発生する場合は、usr_confirmテーブルの主キー フィールドが で正しく構成されていることを確認する必要がありますauto_increment。また、適切に設定されている場合は、呼び出しの結果がmysql_insert_id($conn);どこにあるかなど、接続変数を関数に渡してみてください。$connmysql_connect()

サイト ノート(特定の回答ではありません)
あなたのコードはSQL インジェクションの影響を非常に受けやすくなっています。値をエスケープていません。SQL インジェクションとは何かを説明するのではなく、Prepared Statements を使用するように指示したいと思います。

さらに、PHP はメソッドを廃止し、メソッドとmysql_メソッドを優先します。これらはどちらも準備済みステートメントをサポートしているため、これらを調べることをお勧めします。mysqli_PDO

mysql_real_escape_string()当面の間、次のように変数を でラップすることを検討してください。

... values ('" . mysql_real_escape_string($username) . "', ...
于 2012-10-09T19:19:33.197 に答える
0

メールを送信するまでクエリを実行しておらずmysql_insert_id、前のクエリでAUTO_INCREMENT列に対して生成されたIDを指定しているため、使用する前にクエリを1つ配置する必要があります。mysql_insert_id

于 2012-10-09T19:22:06.140 に答える