1

クライアントのIPアドレスを保存するために使用しようとしているコードは次のとおりです。IP アドレスを unsigned int に保存しようとしています。これは、次の質問に見られるようなことをしようとしています: IP アドレスにどの MySQL データ型を使用しますか?

これが私のコードです:

$client_ip = $_SERVER['REMOTE_ADDR'];

$ip_insert = "SELECT INET_ATON('$client_ip')";

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')";

そのステートメントには他にも保存されているものがありますが、それらのものは無視してください。それらは機能します。そうでないのはIPアドレスです。

エラー:

エラー: SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の '192.168.2.1')​​','email@email.com','Hmmmm')' 付近で使用する正しい構文を確認してください。

Near の後の IP アドレスは、実際には正しい IP を示しています。もちろん、セキュリティ上の理由からローカル IP に切り替えただけです。email@email.com とうーん、これを有効にするために記入されたフォームからのものなので、気にしないでください。

私が間違っていることを誰かが知っていますか?私はSQLが初めてです。

4

6 に答える 6

5

あなたはこれをやっています:

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',SELECT INET_ATON('$client_ip'),'$email','$message')";

設定しているため:

$ip_insert = "SELECT INET_ATON('$client_ip')";

そして、それは以下でなければなりません:

$ip_insert = "INET_ATON('$client_ip')";

これはそれを行う方法です:

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',INET_ATON('$client_ip'),'$email','$message')";
于 2012-05-08T18:36:47.593 に答える
2
$ip_insert = "SELECT INET_ATON('$client_ip')";

は単なる文字列です。この文字列をデータベースにクエリしてから、結果をフェッチするか、

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',INET_ATON('$client_ip'),'$email','$message')";
于 2012-05-08T18:37:35.043 に答える
1

私はあなたが欲しいと思います:

$ip_insert = ip2long($client_ip);
$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')";

ただし、次を使用することをお勧めします。

$sth = $dbh->prepare("INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES (?,?,?,?)");
$sth->bindParam(1, $name, PDO::PARAM_STR);
$sth->bindParam(2, $ip_insert, PDO::PARAM_INT);
$sth->bindParam(3, $email, PDO::PARAM_STR);
$sth->bindParam(4, $message, PDO::PARAM_STR);
$sth->execute();
于 2012-05-08T18:40:59.263 に答える
0

SQLステートメントに余分な ) があるようですが、なぜそこにあるのかわかりません。unsigned int への変換がうまくいかないようです。数値を挿入していて、そのエラーが文字列を挿入していることを示しているため、 $ip_insert を一重引用符で囲むこともできます。

'192.168.2.1')​​' は、文字列ではなく数値を挿入しようとしているため、正しく見えません。何が実行されているかを正確に確認するには、ステートメント全体をログに記録する必要があります。Google ロギング SQL ステートメント mysql とロギングを設定します。クエリ チェック ログを実行し、それを試してデバッグします。

単純な構文エラーのようです。しかし、私は 7 年以上 PHP に触れていないので、間違っている可能性があります。

于 2012-05-08T18:45:39.650 に答える
0

どのバージョンの mysql を実行していますか? inet_aton('192.168.1.1')SQL コマンド ラインでコマンドを実行してみて、動作するかどうかを確認してください。次のような出力が必要です。

mysql> select inet_aton('192.168.1.1');
+--------------------------+
| inet_aton('192.168.1.1') |
+--------------------------+
|               3232235777 |
+--------------------------+
1 row in set (0.00 sec)

inet_aton() 関数が機能していないようです。そのため、SQL エラーに IP アドレスが表示されます。

于 2012-05-08T18:36:28.053 に答える
0

INET_ATONの代わりに使用します"SELECT INET_ATON"(これは DB からレコードを返すため)。

于 2012-05-08T18:39:26.287 に答える