-1

重複の可能性:
PHP を使用して SQL データベースにデータを挿入できない理由

一言で言えば、データをデータベースに保存するログインフォームを書いています。私のhtmlとスクリプトは、この正確な瞬間にセキュリティをあまり考慮せずに、完全に機能するはずです. しかし、私が抱えている問題は、私のphpスクリプトが私のSQLデータベースを更新しないことです. すべてが正常にチェックアウトされ、すべてのポスト変数が引き継がれ、挿入されません。ユーザー(はい、ルートを使用しています)には何らかの理由で十分な権限がないのではないかと考えているので、新しい「管理者ユーザー」を設定する方法を知りたいと思っていました。私のWindows 7マシンでWAMPを実行している場合、それが大きな違いをもたらします。

私のフォーム:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Registration</title>
</head>

<body>

<form action="register.php" method="post" />
<p>Username:</p><input type="text" name="username" />
<p>Password:</p><input type="text" name="password" />
<p>Name:</p><p>First:<input type="text" name="fname" />Last:<input type="text" name="lname" /></p>
<p>Email:</p><input type="text" name="email" />
<input type="submit" />

</body>
</html>

私のスクリプト:

<?php

$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password=""; // Mysql password 
$db_name="login"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form 
$myusername=$_POST['username']; 
$mypassword=$_POST['password']; 
$myfname=$_POST['fname'];
$mylname=$_POST['lname'];
$myemail=$_POST['email'];



// To protect MySQL injection 
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// username taken
echo "Username already taken";
exit();
}

//protection against sql injection
if (get_magic_quotes_gpc())
{
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map(stripslashes_deep, $value) :
stripslashes($value) ;
return $value;
}
$_POST = array_map(stripslashes_deep, $_POST);
$_GET = array_map(stripslashes_deep, $_GET);
$_COOKIE = array_map(stripslashes_deep, $_COOKIE);
$_REQUEST = array_map(stripslashes_deep, $_REQUEST);
}

//insert form into DB members




'INSERT INTO members SET
username="' . $myusername . '",
password="' . $mypassword . '",
fname="' . $myfname . '",
lname="' . $mylname . '"
email="' . $myemail . '"';

session_register("myusername");
session_register("mypassword"); 
header("location:registersuccess.html");
?>

テーブルの作成に使用される sql コマンド:

use login
>database changed
CREATE TABLE members(
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
fname VARCHAR(30) NOT NULL,
lname VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL
)
;

その後、コマンドラインからユーザーの更新を追加できますが、php は使用できません。ここでも root アカウントとパスワードを使用します。スクリプトは、すべての準備ができているユーザーが存在するかどうかを正常にチェックするため、サーバーに接続します。さらに情報が必要な場合は、お問い合わせください。

4

2 に答える 2

3

1) まず、古いmysql_*機能は使用しないでください。それらは安全ではなく、減価償却されています (ここの赤いボックスを参照してください)。代わりに、PDO または MySQLi の使用を検討してください。習得に時間がかからず、慣れれば使いやすさなど、あらゆる点ではるかに優れています。

2) 第二に、SET主にUPDATEコマンドに使用され、一般的には使用されませんINSERT。コマンドは通常、次のINSERTようになります。

INSERT INTO `tbl` (`column1`,`column2`) VALUES ('value1','value2');

MySQLのマニュアルを参照してください。

3) 第三に、コードが間違ってコピーされたかどうかはわかりませんが、次の挿入文字列を変数に割り当てたり、実行したりしているようには見えませんか?

'INSERT INTO members SET
username="' . $myusername . '",
password="' . $mypassword . '",
fname="' . $myfname . '",
lname="' . $mylname . '"
email="' . $myemail . '"';

(構文については、ポイント 2. を再度参照してください)。

4) 4つ目はインデント!! 読みやすく、デバッグもしやすくなります。適切にインデントされたコードは、多くの時間を節約できる適切な「デバッグ」手順を開始する前に、コードを読むだけでエラーを表示できます! :)

于 2012-09-14T20:10:08.780 に答える
0

データベースに何かを挿入しているようには見えません。挿入を実行するにmysql_queryは、select ステートメントで使用したのと同じ関数を使用する必要があります。また、挿入の構文が正しくありません。

于 2012-09-14T20:01:57.293 に答える