1

私は妹のために非常に簡単な座席表アレンジャーを書いています。それはすべて、参加者のリストを含むデータベースであり、それぞれにテーブル番号が割り当てられています ( $tano)

私のPHPは次のとおりです。

$con = mysql_connect('localhost', $dbuser, $dbpass) or die(mysql_error());
$db = mysql_select_db($dbname, $con) or die(mysql_error());

// Get current table no
$tableno = $_GET["t"];

// Current table -> array
$t = array();
$i = 0;
$result = mysql_query('SELECT * FROM plan WHERE tano = $tableno ORDER BY fname');
while($row = mysql_fetch_array($result)) {
$t[$i] = $row;
$i++;
}

// Get other tables (Seats Remaining)
for ($i = 1; $i <= 40; $i++) {
    $result = mysql_query("SELECT * FROM plan WHERE 'tano' = $i");
    $seatsremaining = 10-mysql_num_rows($result);
         if ($seatsremaining == 0) {$d[$i] = "Table ".$i." (No Seats Remaining)";}
    else if ($seatsremaining == 1) {$d[$i] = "Table ".$i." (1 Seat Remaining)";}
    else if ($seatsremaining >= 2) {$d[$i] = "Table ".$i." (".$seatsremaining." Seats Remaining)";}
}

?>

残りの HTML コードは www.greenbottleblue.com で見ることができます。

配列に値が入力されておらず、厄介な SQL エラーが発生しています。

警告: mysql_fetch_array() は、パラメーター 1 がリソースであると想定しており、18 行目の /home/greenbot/public_html/index.php で指定されたブール値です。

テーブル構造は次のとおりです。

ここに画像の説明を入力

4

1 に答える 1

1

最初のクエリでは、値を引用符で囲んでいません:

$result = mysql_query('SELECT * FROM plan WHERE tano = $tableno ORDER BY fname');

これは次のようになります。

$result = mysql_query("SELECT * FROM plan WHERE tano = '$tableno' ORDER BY fname");

2 番目のクエリでは、列名の前後に逆引用符の代わりに引用符を使用しています。

$result = mysql_query("SELECT * FROM plan WHERE 'tano' = $i");

これは次のようになります。

$result = mysql_query("SELECT * FROM plan WHERE `tano` = $i");

コードは、チェックではなく、クエリが正常に完了したと想定していることに注意してください。デバッグ目的で、以下を追加できます。

... or die(mysql_error());

mysql_query(...)試行されたクエリの詳細を取得するには、各ステートメントの最後まで。本番コードでこのようなエラーのロギング戦略を開発する必要があります。

さらに、フィルタリングされていないユーザー入力を使用$tableno = $_GET["t"];すると、SQL インジェクション攻撃の扉が開かれることに注意してください。パラメーター化された PDO クエリを使用するようにコードを更新するか、少なくとも受信データをフィルター処理することを検討してください。

于 2013-05-30T17:00:03.107 に答える