2017-09-08 6 views
0

イムを動作しますが、私は私の問題のためにネットには答えを見つけない:UPDATE単一の特定のMySQLの細胞は文句を言わないPHP/MySQLへかなり新しい

私は4つのテキストフィールド

<form method="post" action="updateuserdatatest.php"> 
<input type="text" value="Hans" name="username"> 
<input type="text" value="1234" name="password"> 
<input type="text" value="desired cell" name="desiredcell"> 
<input type="text" value="desired value" name="desiredvalue"> 
<input type="submit"> 
</form> 

でフォームを持っています私は、 "希望する値"で、 "希望するセル"という名前の更新をしたいと思います。 だから私は、ユーザー名、パスワード、列名(すなわち、 "streetname"、 "postcode"または "city")を入力しなければならず、その後にstringvalueをデータベースに提出しなければなりません。

私はこのコードを使用します。

$pdo = new PDO(everything is OK here! - Checked this out many times); 
    $sql = 'UPDATE user SET :desiredcell = :desiredvalue WHERE username = :username AND password = :password'; 

    $stmt = $pdo->prepare($sql); 

    $stmt->bindValue(":desiredcell", $_POST['desiredcell'], PDO::PARAM_STR); 
    $stmt->bindValue(":desiredvalue", $_POST['desiredvalue'], PDO::PARAM_STR); 
    $stmt->bindValue(":username", $_POST['username'], PDO::PARAM_STR); 
    $stmt->bindValue(":password", $_POST['password'], PDO::PARAM_STR); 
    $stmt->execute(); 

if ($stmt->errno) { echo "FAILURE!!! " . $stmt->error; 
} 
else echo "Updated {$stmt->affected_rows} rows"; 

$response = array(); 
$response['success'] = true; 

echo json_encode($response); 

?> 

これは動作しません!

しかし、私は'UPDATE user SET streetname = :desiredvalue WHERE username = :username AND password = :password';

のような特定のColumnNameにするには、SQLクエリを変更するとき、それは働きます!どうして? 私は手動で更新する必要があるcellnameをタイプしたいと思う!

私は私が間違って何をやっている

UPDATE user SET ?=? WHERE password=? AND username=?同じ問題のように前にmysqliのクエリでこれを試してみましたか? ありがとうございます。

編集:私はあなたの例のように列変数を挿入しようとすると、 これは私のダミーのテーブルで、

enter image description here

: は、私がコメントに画像を投稿傾けるようですので、私は別の答えを作りますテーブルの中で何も起こらないが、私はまだ成功の応答を得る。

$column = in_array($_POST['desiredcell'], ['streetname', 'postcode','state']) ? $_POST['desiredcell'] : 'streetname';   
$sql = 'UPDATE user SET $column = :desiredvalue WHERE username = :username AND password = :password'; 

$stmt = $pdo->prepare($sql); 

$stmt->bindValue(":desiredvalue", $_POST['desiredvalue'], PDO::PARAM_STR); 
$stmt->bindValue(":username", $_POST['username'], PDO::PARAM_STR); 
$stmt->bindValue(":password", $_POST['password'], PDO::PARAM_STR); 
$stmt->execute(); 

ヒント? =/

EDIT: ソリューションが見つかりました:

$sql = 'UPDATE user SET '.$column.' = :desiredvalue WHERE username = :username AND password = :password'; 

は君たちに感謝します。

+2

[PDO](http://php.net/manual/en/book.pdo.php)では、テーブル名とカラム名を置き換えることはできません。この質問を参照してください:https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as-parameter – surfer190

+1

[PHP PHP PDOステートメントが受け入れることができるパラメータとしての表または列の名前?](https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as-parameter) – Qirel

+0

PDOもMySQLiは有界表または列名をサポートしています。** IFのクエリで変数を直接使用することができます。**を使用する場合は、最初にホワイトリストを作成します(基本的に入力が何であるかを確認し、適切な列/テーブルを持つ独自のサーバーサイド定義変数を使用します)。 – Qirel

答えて

0

コメントのとおり、列名をバインドすることはできません。データベースにプレーンテキストのパスワードを格納する本物であることを

<?php 
$column = in_array($_POST['desiredcell'], ["column1", "column2"]) ? $_POST['desiredcell'] : "column1"; 
$sql = "UPDATE user SET $column = :desiredvalue WHERE username = :username AND password = :password'"; 

はまた、心に留めて:あなたは、変数を使用し、入力が

例(セキュリティ上の理由のために)実際のカラム名であることを確認する必要があります悪いアイデア。 password_hashの機能を確認してください。

+0

プレーンパスワードはテスト目的にすぎません! –

関連する問題