1

テストコードに関する学生情報と、それらのテストコードで達成されたマークを含む巨大なデータベースがあります。各テスト コードに対応する学生のパーセンタイル マークを再計算する必要があります。一連のテスト コードのコードがありますが、正しく動作しません。

function recompute_percentiles()
{
if($_REQUEST[testcode]=="CAT B1" or $_REQUEST[testcode]=="CAT B2" or $_REQUEST[testcode]=="CAT B3" or $_REQUEST[testcode]=="CAT B4")
{

echo "<br />Got testcode: ".$_REQUEST[testcode];


$getsortedq=mysql_query("SELECT username, section1right as m from kmarks where testcode='.$_REQUEST[testcode].' order by section1right DESC");

if(!$getsortedq) 
echo "Could not get the sorted query";
else 
echo "got the sorted query quick";



$totalcount=mysql_num_rows($getsortedq);

while($r=mysql_fetch_array($getsortedq))
{
$u=$r[username];
$m=$r[m];
$array[$u]=$m;
}



$array2=$array;
//print_r($array2);

$updated=0;

foreach($array as $key=>$value)
{
$countsame=0;
foreach($array2 as $k=>$v)
{
    if($v>=$value) 
    $countsame++; 
    else
    break;
}
$countless = $totalcount - $countsame;

reset($array2);

$percentile=round($countless/$totalcount*100,2);

$updatep1q=mysql_query("UPDATE kmarks set percentile1=$percentile where   username='.$key.' and testcode='.$_REQUEST[testcode].'");

if(!$updatep1q)
  echo "<br />Could not update p1 for username: ".$key;
else
    $updated++;


}

echo "<br />Updated ".$updated." records in kmarks db, out of ".$totalcount." records for  testcode ".$_REQUEST[testcode];




}
}
4

2 に答える 2

2

このコードには複数の深刻な問題があります - 機能に触れなくても...

1 PHP 構文

$_REQUEST[testcode]

よくありません。常にブレースを使用してください。

$_REQUEST['testcode']

2 注射傾向

あなたはSQLインジェクションHTML/Javascriptインジェクションに対して広くオープンです

echo "<br />Got testcode: ".$_REQUEST[testcode]; //HTML injection...
//SQL injection
$getsortedq=mysql_query("SELECT username, section1right as m from kmarks where testcode='.$_REQUEST[testcode].' order by section1right DESC"); 

常に適切なサニタイズを使用してください (mysql(i)_real_escape_string($_REQUEST['testcode'])使用されている mysql_ または mysqli に応じて)。またはさらに良い: SQL の場合の準備済みステートメント...

3 非推奨

必須の mysql_* 警告: mysql_関数は、PHP 5.5 で非推奨になりました。それらを使用しないでください: PDO または少なくともmysqli_関数のいずれかを使用してください...

機能性

これが犯人です:

$updatep1q=mysql_query("UPDATE kmarks set percentile1=$percentile where   username='.$key.' and testcode='.$_REQUEST[testcode].'");

結果のクエリは次のようになります。

UPDATE kmarks set percentile1=<somevalue>  --this is OK
where username='.<somevalue>.' and testcode='.$_REQUEST[testcode].'
                ^           ^                ^^^^^^^^^^^^^^^^^^^^^

問題が強調されています... 不要な点があり、全体的に悪い部分があります。こういうの欲しかったんだろうな

UPDATE kmarks set percentile1=<somevalue>  
where username='<somevalue>' and testcode='<somevalue>'

代わりに次のように使用します (もちろん、サニタイズを使用して!!!):

//WARNING! STILL HAS SQL INJECTION --apply sanitization from #2 to make it safer...
$updatep1q=mysql_query("UPDATE kmarks set percentile1=$percentile where username='".$key."' and testcode='".$_REQUEST[testcode]."'");

配列は文字列リテラル内では使用できず.、プレーン変数の場合、連結演算子は必要ありません...

于 2013-09-30T12:43:01.393 に答える