2017-03-22 7 views
1

ユーザーが国を選択できる選択フィールドが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)) 

うまくいけば、私は自分自身を明らかにしました。どんな助けもありがとう!

+0

私は問題を特定しました。それはSQLステートメントにあります。ある国に選手がいない場合、返される数値は0なので、ヌルではなく、レコード全体が空ではない。私はこれをどのように修正できるか分かりません。 – Pete

+0

COUNT(Cyclist.name)をnoOfAthleteとして削除すると、if条件が正常に機能します。配列構造を損なうことなく、SQLステートメントからCOUNT(Cyclist.name)をインポートするにはどうすればよいですか? – Pete

+0

また、あなたのコードはSQLインジェクションに非常に脆弱です。決して_GETデータを取ってSQLにパススルーするべきではありません。 – Trent

答えて

1

はあなたが動のVAR列

$varStr = " ('country1' , 'country3') "; 

を構築することができます(あなたがCOUNTRY1とCOUNTRY2 nullではないを持っていると仮定すると)$ _GETをチェック

によって句とグループ内でクエリを使用することができます。

"SELECT Country.ISO_id, Country.Name, COUNT(Cyclist.name) as noOfAthlete 
    FROM Country 
    LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id 
    WHERE Country.ISO_id in ". $varStr . 
    "group by Country.ISO_id, Country.Name"; 
関連する問題