

ある教材を元にphp,MySQLを勉強しています。

フォーム情報が正しく入力されると「1was inserted」と表示され、  
データベースに情報が保存されるはずですが、正しく処理されません。

※「-1was inserted」と「-」がついてしまいます。  
※データベースにも保存されません。

何が原因か教えて頂けますでしょうか？

* * *
[code]

    <html>
    <head>
    </head>
    
    <body>
    
    <form method="post" action="insert.php">
    Name: <input type="text" name="name" /><br />
    Email: <input type="text" name="email" /><br />
    Password: <input type="password" name="password" /><br />
    <input type="submit" value="register" /><br />
    </form>
    
    </body>
    </html>
    
[/code]

* * *
[code]

    <?php
    
    $name = $_POST["name"];
    $email = $_POST["email"];
    $password = $_POST["password"];
    
    if($name && $email && $password){
        mysql_connect("localhost","root","") or die("we could not connect!");
        mysql_select_db("testsite");
        mysql_query("INSERT INTO users(name,email,password) VALUES ($name,$email,$password)");
        $registered = mysql_affected_rows();
        echo "$registered was inserted";
    } else {
        echo "you have to complete the form";
    }
    
    mysql_close();
    
    ?>
    
[/code]


CC BY-SA 3.0
2015-05-08T09:05:01.507
9946
2015-05-08T09:37:16.437
2015-05-08T09:09:19.170
440
7176
question
php mysql
MySQLの「INSERT INTO」に関して


`mysql_affected_rows` は最終クエリが失敗すると -1 を返します。

<https://stackoverflow.com/questions/6722809/mysql-affected-rows-returns-1>

理由ですが、`$name` や `$email`、`$password` はおそらく文字列です。`"..."`
の中で使用するとリテラルとして扱われます。例えば `$name` に `test`、`$email` に
`test@example.com`、`$password` に `my-password` と入っていた場合、クエリは

[code]

    INSERT INTO users(name,email,password) VALUES (test,test@example.com,my-password)
    
[/code]

となります。実際に期待しているのは

[code]

    INSERT INTO users(name,email,password) VALUES ('test','test@example.com','my-password')
    
[/code]

です。ですので

[code]

    mysql_query("INSERT INTO users(name,email,password) VALUES ('$name','$email','$password')");
    
[/code]

として下さい...と書く人もいますが、これが一番やってはいけない事です。

[code]

    mysql_query(sprintf("INSERT INTO users(name,email,password) VALUES ('%s','%s','%s')",
        mysql_real_escape_string($name),
        mysql_real_escape_string($email),
        mysql_real_escape_string($password)));
    
[/code]

といった具合に `mysql_real_escape_string` を使用してエスケープするか、PDO 等を使って `prepared
statements` にするべきです。

<http://php.net/manual/ja/pdo.prepared-statements.php>

なぜやってはいけないかについては徳丸さんのサイトを見ると勉強になると思います。

<http://blog.tokumaru.org/>


CC BY-SA 3.0
2015-05-08T09:17:49.943
9948
2015-05-08T09:37:16.437
2017-05-23T12:38:56.467
-1
440
9946
answer