0

データベースにユーザーを挿入するスクリプトがあります。以前は MYISAM で動作していましたが、INNODB に変更してから 1 行目しか挿入されず、その後停止します。

これがスクリプトです。基本的に、すべての Facebook の友達を取得し、ユーザーがデータベースに存在するかどうかを確認します。そうでない場合は、新しい「未登録」ユーザーが作成されます。INNODB に変更したため、最初のユーザーのみが挿入されます。テーブル作成コードも掲載します。任意のヒント?

$data = explode(";", $_POST['data']);
for($i=0; $i<count($data); $i++){
    $user = explode("^", $data[$i]);
    $fname = $user[0];
    $lname = $user[1];
    $face_uid = $user[2];
    $birthday = $user[3];
    $gender = $user[4];

    $temp_birth = explode("/", $birthday);
        if(count($temp_birth)!=3){
            $birthday="0000-00-00";
        } else {
            $birthday = $temp_birth[2]."-".$temp_birth[0]."-".$temp_birth[1];
        }

        if(ctype_alnum(str_replace(" ", "", $fname)) && ctype_alnum(str_replace(" ", "", $lname))){
            $result = mysql_query("SELECT * FROM popguest.user WHERE face_uid='$face_uid'");
            $row=mysql_fetch_array($result);
            if(mysql_num_rows($result)==0){

                $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
                $size = strlen( $chars );
                $verify=0;
                while($verify==0){
                    $username='';
                    for($j = 0; $j < 10; $j++) {
                        $username .= $chars[ rand( 0, $size - 1 ) ];
                    }
                    $result2 = mysql_query("SELECT * FROM popguest.user WHERE username='$username'");
                    if(mysql_num_rows($result2)!=0){
                        $verify=0;
                    }else{
                        $verify=1;
                    }
                }

                $result = mysql_query("INSERT INTO popguest.user (face_uid, username, fname, lname, birthday, gender, registered) VALUES ('$face_uid', '$username', '$fname', '$lname', '$birthday', '$gender', '0')");

                echo $fname." ".$lname.";".$face_uid.";".$birthday.";".$gender."\n";

            } else {

            }
        } else {

        }
}
CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(10) COLLATE latin1_general_ci NOT NULL,
 `face_uid` varchar(15) COLLATE latin1_general_ci NOT NULL,
 `fname` varchar(25) COLLATE latin1_general_ci NOT NULL,
 `lname` varchar(25) COLLATE latin1_general_ci NOT NULL,
 `email` varchar(50) COLLATE latin1_general_ci NOT NULL,
 `gender` varchar(6) COLLATE latin1_general_ci NOT NULL,
 `birthday` date NOT NULL,
 `type` int(1) NOT NULL,
 `registered` int(1) NOT NULL,
 `phone` varchar(15) COLLATE latin1_general_ci NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `username` (`username`),
 UNIQUE KEY `face_uid` (`face_uid`),
 UNIQUE KEY `email` (`email`)
) ENGINE=INNODB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
4

1 に答える 1

1

私が見るものがいくつかあります:

  • エラーが発生したかどうかについては言及していません。コードもトラップ用に作成されていないため、スクリプトにデバッグを追加して、mysqlエラーをチェックします。例:$ error = mysql_errno($ link)、trigger_error( $ error、E_USER_WARNING)種類。
  • latin1照合を使用しているようですが、その文字セットに属していないユーザー名のユーザーをインポートするとどうなるでしょうか。これにはずっとutf8を使用します。2番目のユーザーがそのようなデータを持っている場合、私の最初の提案はその理由を教えてくれます。
于 2012-09-18T16:53:05.140 に答える