2016-09-30 19 views
0

名前、電子メール、携帯電話番号、グループなどの異なるフィールドとパスワードフィールド、質問とは無関係のその他のフィールドを持つデータベースがデータベースにあります。
ここでは、メールが提供されるのかグループが提供されるのかに基づいてパスワードを変更したいと考えています。グループの列に基づいてグループのパスワードを変更してください

mysqli_query($con, "UPDATE test_taker SET test_taker_password = CONCAT(test_taker_password, SUBSTRING($select1, '$from1', '$to1')) where test_taker_email = '$mail' OR test_taker_group = '$group'"); 

と私は、この内部を使用しています:
私のパスワードを変更するための基本的なsqlクエリがある

$setRec = mysqli_query($con,"select * from test_taker where test_taker_email = '$mail' OR test_taker_group = '$group' "); 

while($rec = mysqli_fetch_array($setRec)) 
{ 
    mysqli_query($con, "UPDATE test_taker SET test_taker_password = CONCAT(test_taker_password, SUBSTRING($select1, '$from1', '$to1')) where test_taker_email = '$mail' OR test_taker_group = '$group'"); 
    $password=$rec['test_taker_password']; 
} 

と私はメールでしようとしたとき、それは完全に正常に動作しますが、私はとしようとすると、グループのwhileループは、setRecで取得された行数の回数だけ複製します。
たとえば、パスワードがabcd10、abから名前、cdが電子メール、モバイルから10であり、指定されたグループに2つの行がある場合、返されるパスワードはababcdcd1010です。

メールを傷つけることなく、このグループの問題を解決する方法を教えてください。

+0

「WHERE(test_taker_email = '$ mail' OR test_taker_group = '$ group') 'で試してください – devpro

+0

重要なシステムにパスワードをハッシュとして保存してください。家庭用のクーポンデータベースは、必ずしも修飾されません – Drew

+0

なぜループを使用しますか?更新クエリは、選択クエリが取得するレコードと同じレコードを対象とします。したがって、更新クエリは、外観だけで使用する必要があります。また、アップデートには、コードに定義されていないいくつかの変数があります。 – RamRaider

答えて

0

OR条件で最初にselectクエリを使用した場合は、行数が表示されます。そのレコードにwhileループを適用しました。今度は、whileループを適用しているときはいつでも、あなたのレコードカウンターがアップしたときに何度も実行されます。 whileループでは、毎回レコードを更新するORの条件を使用してレコードを実行しています。

$setRec = mysqli_query($con,"select * from test_taker where test_taker_email = '$mail' OR test_taker_group = '$group' "); 

このクエリは where test_taker_email = '$mail' OR test_taker_group = '$group'

の組み合わせで10件のレコードを返し、また、あなたが、毎回そうwhere句where test_taker_email = '$mail' OR test_taker_group = '$group'

を与えるようクエリは、すべての10のレコードに対してアクションを実行します更新したとループが実行されると、条件がいっぱいになるすべてのレコードに対してアクションが実行されます。

0

ループのポイントを見落としていない限り、1つの更新文で更新を行うことができます。しかし、SQLに直接変数を埋め込むことで、SQLインジェクションに脆弱になりました。以下のコードは、準備されたステートメント(元のコードに従うプロシージャスタイル)を使用し、関連するレコードを安全に更新する必要があります。

$dbhost = 'localhost'; 
$dbuser = 'xxx'; 
$dbpwd = 'xxx'; 
$dbname = 'xxx'; 
$con = mysqli_connect($dbhost, $dbuser, $dbpwd, $dbname);  

$sql = 'update `test_taker` set 
     `test_taker_password` = concat(`test_taker_password`, substring(?, ?, ?)) 
     where `test_taker_email` = ? or `test_taker_group` = ?'; 

$stmt = mysqli_stmt_init($con); 
$res = mysqli_stmt_prepare($stmt, $sql); 

if($res){ 
    mysqli_stmt_bind_param($stmt, "siiss", $select1, $from1, $to1, $mail, $group); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_close($stmt); 
} else { 
    echo "Error!"; 
} 

mysqli_close($con); 
0

私は最終的に、このようにそれを解決:皆さんに感謝....クエリは、ユーザーがそれを意図した回数だけを実行できるように、私はorderuser部分を追加

$connectorvar = mysqli_query($con,"select * from templatetable WHERE templateid = '$test123' ORDER BY orderuser"); 
while($rec = mysqli_fetch_array($test1)){ 
    while($connectorwhile = mysqli_fetch_array($connectorvar)){ 
     $select1 = $connectorwhile['selectfromuser']; 
     $from1 = $connectorwhile['fromuser']; 
     $to1 = $connectorwhile['touser']; 

$setRec = mysqli_query($con,"select * from test_taker where (test_taker_email = '$mail' OR test_taker_group = '$group') "); 
mysqli_query($con, "UPDATE test_taker SET test_taker_password = CONCAT(test_taker_password, SUBSTRING($select1, '$from1', '$to1')) where test_taker_email = '$mail' OR test_taker_group = '$group'"); 
}} 

私を助けるために...

関連する問題