0

タイトルが示すように、フォームがいくつかの条件を満たした場合、データを 2 つのテーブルに挿入しようとしています (ユーザーがログインしている、ユーザーが以前にその製品に投票したことがない、すべてのフィールドが入力されている)。 .

条件が次の場合、両方のテーブルにデータを完全に挿入していました。

$sql = "SELECT productid FROM votes WHERE username='$username' LIMIT 1";

しかし、ユーザーがいずれかの製品に投票した場合、ユーザー名がテーブルに表示され、製品に投票せずに条件に失敗することに気付きました。だから私はちょうど追加しました:

$sql = "SELECT productid FROM votes WHERE username='$username' AND productid='$id' LIMIT 1";

そして今、データベースにデータを送信しようとすると、常に「投票テーブルへの挿入エラー」メッセージが返されますが、mysql_error() は返されず、明らかに新しい行が投票テーブルに挿入されませんが、奇妙なことに製品テーブルを更新します。

何が起こっているのかわからないので、問題の診断を手伝ってくれる人がいれば、本当に感謝しています! コードは次のとおりです。

<?php
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        if($_POST['slider_surface'] !== "0" && $_POST['slider_edgewear'] !== "0" && $_POST['slider_centering'] !== "0" && $_POST['slider_corners'] !== "0"){
            $dbhost = 'localhost';
            $dbuser = 'root';
            $dbpass = 'root';
            $conn = mysql_connect($dbhost, $dbuser, $dbpass);
            if(! $conn )
                {
                    die('Could not connect: ' . mysql_error());
                }

            $slider_surface = $_POST['slider_surface'];
            $slider_edgewear = $_POST['slider_edgewear'];
            $slider_centering = $_POST['slider_centering'];
            $slider_corners = $_POST['slider_corners'];
            $id = preg_replace('#[^a-z0-9]#i', '', $_GET['id']);
            session_start();
            $username = $_SESSION['username'];
            //check if user has already voted
            mysql_select_db('products');
            $sql = "SELECT productid FROM votes WHERE username='$username' AND productid='$id' LIMIT 1";
            $query = mysql_query( $sql, $conn );
            $uname_check = mysql_num_rows($query);
            if ($username){
                if ($uname_check < 1) {


                    $sql =  "INSERT INTO votes ".
                            "(username,productid,votesurface,voteedgewear,votecentering,votecorners,datetime) ".
                            "VALUES('$username','$id','$slider_surface','$slider_edgewear','$slider_centering','$slider_corners', now())";

                    $retval = mysql_query( $sql, $conn );

                    $id='';

                    // Make sure the _GET product ID is set, and sanitize it
                    $id = preg_replace('#[^a-z0-9]#i', '', $_GET['id']);

                    //Retrieves data from MySQL 
                    $data = mysql_query("SELECT * FROM products WHERE id='$id'") or die(mysql_error()); 
                    $product = mysql_fetch_array( $data );

                    $newvotecount = $product['votecount'] + 1;
                    $newsum_surface = $product['sumsurface'] + $slider_surface;
                    $newsum_edgewear = $product['sumedgewear'] + $slider_edgewear;
                    $newsum_centering = $product['sumcentering'] + $slider_centering;
                    $newsum_corners = $product['sumcorners'] + $slider_corners;

                    $sql =  "UPDATE products SET votecount='{$newvotecount}', sumsurface='{$newsum_surface}', sumedgewear='{$newsum_edgewear}', sumcentering='{$newsum_centering}', sumcorners='{$newsum_corners}' WHERE id='$id'";

                    $retval2 = mysql_query( $sql, $conn );


                    if(! $retval){
                        die('Error inserting into votes table: ' . mysql_error());
                    }
                    else if(! $retval2){
                        die('Error inserting into products table: ' . mysql_error());
                    }
                    $grading_error = 'success';
                    mysql_close($conn);
                } else
                    $grading_error = 'duplicateuser';
        } else
            $grading_error = 'nouser';
        }
    else
        $grading_error = 'emptyfields';}
?>
4

1 に答える 1

0

INSERTテーブルにデータを挿入するときに問題があるため、ステートメントにエラーがあるはずです。@ user2910809 が以前のコメントで述べているように、次のようにsql評価されます。

INSERT INTO votes (username,
                   productid,
                   votesurface,
                   voteedgewear,
                   votecentering,
                   votecorners,
                   datetime) 
           VALUES ('magmar',
                   '52',
                   '7',
                   '6',
                   '5',
                   '5',
                   now())

この文は構文的に正しいです。したがって、エラーがある場合は、挿入された値である必要があります。

@ user2910809 がコメントで述べているように、列にUNIQUEキーがusernameあり、それがエラーをスローしていました。

したがって、解決策は、同じ .xml を持つ複数の行を許可するようにテーブルのインデックスを変更することusernameです。

編集:コメントで示唆されているように、この問題を解決するためのSQLは次のとおりです。ALTER TABLE votes DROP INDEX username;

于 2013-11-07T13:14:00.113 に答える