ユーザーが国を選択できる選択フィールドが4つあります。フィールドの1つがnullの場合、レコードを配列にロードしないPHP
これらの各選択フィールドは、データベースから動的に作成されます。つまり、各オプションはデータベースを介して取得されます。
function addDropMenu($countryNo) {
$conn = new mysqli('localhost', 'xxx', 'zzz', 'aaa') or die ('Cannot connect to db');
$result = $conn->query("SELECT country_name,ISO_id from Country");
$dropMenu = "";
$dropMenu .= "<select style='width:100%' name='$countryNo' >"; // each box has unique id
$dropMenu .= "<option value=''></option>"; //adding an empty selection box
while ($row = $result->fetch_assoc()) {
$countryName = $row['country_name'];
$id = $row['ISO_id'];
$dropMenu .= '<option value="'.$id.'">'.$countryName.'</option>'; //giving the select options the iso id as value and select name
}
$dropMenu .= "</select>";
echo $dropMenu;
}
これらの4つのフィールドのそれぞれの値は、GETを使用してPHPファイルに取り込まれます。これらのフィールドが取得された場合
$country1 = $_GET['country1'];
$country2 = $_GET['country2'];
$country3 = $_GET['country3'];
$country4 = $_GET['country4'];
は、選択した国の検索SQL文は
$sql="SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete
FROM Country
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id
WHERE Country.ISO_id = '$country1'
UNION
SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete
FROM Country
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id
WHERE Country.ISO_id = '$country2'
UNION
SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete
FROM Country
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id
WHERE Country.ISO_id = '$country3'
UNION
SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete
FROM Country
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id
WHERE Country.ISO_id = '$country4'
";
最初の2つのフィールドが必要とされて実行され、第二2はオプションです。
ユーザーが国1と国2に空白の選択肢を選択した場合、エラーメッセージが表示されます。彼が1と2の有効な選択肢を入力したが、国3または4に対して空白の選択肢を入力した場合、空白ではない選択ボックスのみが配列に追加されます(つまり、ユーザーが国1,2,4を選択した場合、国3を配列に追加しないでください)。
問題は、現在選択されているかどうかに関係なく、すべての国が追加されているか、空白のままになっているため、nullフィールドを持つレコードが作成されることです。
これは私の問題がある場所です。レコードのフィールドがnullでない場合にのみ、情報を含む配列を埋める必要があります。
私は以下を実行しようとしましたが、まだ配列に空のレコードがロードされました。
while($row = mysql_fetch_assoc($result)){ //going through each row in the db
if(is_null($row) == 0){ //i have tried empty as well
array_push($rowsArr, $row)
}
else
echo "I wont fill the array with this record";
}
これは、一般的なアレイの印刷時の外観です。すべてのフィールドがnullであるため、3番目のレコードが配列にロードされないようにする必要があり、HTMLテーブルにデータをロードするときに不要なテーブル行が生成されます。
JSON配列
[{"ISO_id":"BEL","gdp":"511533000000","population":"10896000","country_name":"Belgium","gold":"0","silver":"1","bronze":"2","total":"3","noOfAthlete":"14"},
{"ISO_id":"ARM","gdp":"10247788877","population":"3092000","country_name":"Armenia","gold":"0","silver":"1","bronze":"2","total":"3","noOfAthlete":"0"},
{"ISO_id":null,"gdp":null,"population":null,"country_name":null,"gold":null,"silver":null,"bronze":null,"total":null,"noOfAthlete":"0"}].
PHPのARRAY
Array ([0] => Array ([ISO_id] => BEL [gdp] => 511533000000 [population] => 10896000 [country_name] => Belgium [gold] => 0 [silver] => 1 [bronze] => 2 [total] => 3 [noOfAthlete] => 14) [1] => Array ([ISO_id] => ARM [gdp] => 10247788877 [population] => 3092000 [country_name] => Armenia [gold] => 0 [silver] => 1 [bronze] => 2 [total] => 3 [noOfAthlete] => 0) [2] => Array ([ISO_id] => [gdp] => [population] => [country_name] => [gold] => [silver] => [bronze] => [total] => [noOfAthlete] => 0))
うまくいけば、私は自分自身を明らかにしました。どんな助けもありがとう!
私は問題を特定しました。それはSQLステートメントにあります。ある国に選手がいない場合、返される数値は0なので、ヌルではなく、レコード全体が空ではない。私はこれをどのように修正できるか分かりません。 – Pete
COUNT(Cyclist.name)をnoOfAthleteとして削除すると、if条件が正常に機能します。配列構造を損なうことなく、SQLステートメントからCOUNT(Cyclist.name)をインポートするにはどうすればよいですか? – Pete
また、あなたのコードはSQLインジェクションに非常に脆弱です。決して_GETデータを取ってSQLにパススルーするべきではありません。 – Trent