2016-05-31 9 views
-6

このようにphpmyadminのテーブルを更新しています。私の質問は基本的に:'$username'の後にコンマが必要な理由、つまり$query.="username = '$username' , ";このコンマが必要な理由がわかりません。PHP更新テーブルカンマエラー

function UpdateTable() 
{ 
    global $connection; 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $id = $_POST['id']; 
    $query = "UPDATE users SET "; // username is the name of the column in the database, you need the space in between 
    $query.="username = '$username' , "; 
    $query.= "password = '$password' "; 
    $query.= "WHERE id = $id "; 
    $result = mysqli_query($connection,$query); 
    if(!$result) 
    { 
     die("Query failed". mysqli_error($connection)); 
    } 
} 
+3

PHPMyAdmin *はデータベースではありません。これは、あなたのMySQLデータベースのためのWebインターフェイスです。 –

+6

これは、 'UPDATE'ステートメントのための適切なSQL構文であるため、カンマが必要です。 –

+6

**プレーンテキストのパスワードを保存しないでください!**パスワードのセキュリティを処理するには、PHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)を使用してください。 5.5より小さいPHPバージョンを使用している場合、 'password_hash()' [互換パック](https://github.com/ircmaxell/password_compat)を使用することができます。ハッシュする前に[パスワードを逃さないでください](http://stackoverflow.com/q/36628418/1011527)、または他のクレンジングメカニズムを使用していることを確認してください。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –

答えて

1

これはMySQLの構文であるためです。 http://dev.mysql.com/doc/refman/5.7/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
    [WHERE where_condition] 
    [ORDER BY ...] 
    [LIMIT row_count] 
+0

ありがとうございました:)私は前にたくさんのスペースをあけていたことがあると思っていたことを知りませんでした(SETの後ろにスペースを入れるのを忘れるのと同じように) –

0

それは'$user_name'必要はありません:MySQLのドキュメントを確認してください。

の前に、の次の行に次の行が必要です。

'$password'に続くスペースのように厳密には必要ではありません。

の前に、の前に、WHEREの行が必要です。このようにフォーマットされているとして、文の

思う:コンマは、本質的に必要とされる

UPDATE users 
    SET username = ? 
     , password = ? 
    WHERE id = ? 

はとして読み込み「ともSET」

より良いパターンが必要なスペースを付加することであり、/またはそれを必要とする行のコンマで区切ります。それが必要でない行でそれをすることを忘れないでください。例えば

$sql = "UPDATE users"; 
$sql.= " SET username = ?"; 
$sql.= ", password = ?"; 
$sql.= " WHERE id = ?"; 

ここで大きな違いはありません。しかし、実際にSQLを動的に生成する必要がある場合、このパターンははるかに簡単です。


いくつかの追加の考え。

Do NOTは、データベースに平文のパスワードを格納します。代わりにハッシュ値を格納します。

コードはSQLインジェクションに対して脆弱であるようです。

バインドプレースホルダで準備された文を使用します。静的なSQLテキストで、動的に生成されたSQLではありません。