2017-12-03 174 views
2

我在這裏有點困惑。出於某種原因,我的結果再次變得空白。我試圖讓用戶通過輸入他們的名字和姓氏來填寫表格,然後從下拉列表中選擇5個職位。然後,當他們提交表單時,動作PHP將從數據庫中提取特定作業的信息(使用SQL select語句)並顯示用戶的一些結果。我遇到的問題是,對於我的拉動變量,我的結果已經空白。我已經嘗試過六種不同的方式來使這個選擇語句正常工作,但它不會讓步。我有一個處理displayasselect函數並連接到服務器和所有的PHP(因爲某些原因,我在那裏粘貼代碼的時候給了我麻煩)......但是,毫無疑問,無論如何都證明了所有這一切都很好。和PHP後這裏是我的形式:從SQL中獲取變量Select語句where子句來自PHP下拉選擇框

<form class="form-inline" method="get" action="jobTitlePull.php"> 
    <div class="form-group"> 
     <label for="firstName">First Name: </label> 
     <input type="text" name = "fname" id="firstName"/> 
    </div> 
    <div class="form-group"> 
     <label for="lastName">Last Name: </label> 
     <input type="text" name = "lname" id="lastName"> 
    </div> 
     <div class="form-group"> 
     <label for="jobTitle">Job Title: </label> 
     <?php 
      displayAsSelect($list); 
     ?> 
    </div> 
    <input type="submit" class="btn btn-default"></button> 
</form> 

每一件事情都顯得很好的形式。

我遇到的麻煩來自我的動作PHP,這裏我稱之爲jobTitlePull.php。這裏是我的代碼:

<?php 
    $serverName = "xxxxxx"; 
    $userName = "xxxxxx"; 
    $passWord = "xxxxxx"; 
    $database = "xxxxxx"; // last 4 fields purposefully masked. 
    $firstName = $_GET["fname"]; 
    $lastName = $_GET["lname"]; 
    $jobTitle = $_GET["jobName"]; 
    $conn = mysqli_connect($serverName, $userName, $passWord, $database); 
    if (!$conn){ 
     die ("<p>Connection failed: ".mysqli_connect_error()."</p>"); 
    } 
    $queryString = "SELECT jobName, description, posType, basePay FROM Titles WHERE jobName = '$jobTitle'"; 
    $result = $conn->query($queryString); 
    if(!$result){ 
     die ("<p>Query failed</p>"); 
    } 
    $record = mysqli_fetch_assoc($result); //I think my problem MAY lie here?? 
    $desc = $record['description']; //or maybe I'm declaring variables wrong? 
    $pos = $record['posType']; 
    $base = $record['basePay']; 
    echo "<h4>Hello $firstName $lastName Job Title: $jobTitle Job Description: $desc Position Type: $pos Base Pay: $base</h4>"; 
    mysqli_close($conn); 
?> 

select語句中的字段都是正確的。我知道這一點,因爲如果我將WHERE jobName = '$jobTitle'更改爲WHERE jobName = jobName,它將允許我使用while語句並循環並輸出數據庫標題部分中所有字段的所有數據。但我只需要下拉數據。但是,當我將$jobName$jobTitle(和$jobTitle IS拉動正確的信息)相等時,它給出了回顯語句中$desc,$pos和$ base變量的部分的空白結果。

請幫忙。

感謝

+0

當你讀取數據,例如'$ record = $ result-> fetch_assoc();'時,你是否嘗試過使用面向對象的接口?您還應該考慮使用[準備語句](https://websitebeaver.com/prepared-statements-in-php-mysqli-to-prevent-sql-injection)來防止sql注入。另外,如果你已經知道了,那麼檢索'jobName'的原因是什麼? – Cyclonecode

+0

我認爲你的問題是你從'$ _GET'數組獲得的數據包含空格或其他內容,請嘗試修剪數據$ jobTitle = trim($ _ GET ['jobName']);'。如果你能展示如何實現'displayAsSelect()'函數將會很棒。 – Cyclonecode

+0

顯示displayAsSelect()函數。 – Mihai

回答

0

我建議你採取一些不同的方法到當前的查詢,也可以考慮一些你的安全方法來你是如何處理的代碼。

首先everyrhing幾乎保持不變:

$serverName = "xxxxxx"; 
$userName = "xxxxxx"; 
$passWord = "xxxxxx"; 
$database = "xxxxxx"; // last 4 fields purposefully masked. 

更改爲面向對象方法的連接,當你正在處理準備Statemtns它會更容易

$conn = new mysqli($serverName, $userName, $passWord, $database); 
if (!$mysqli->connect_error){ 
    die ("<p>Connection failed: ". $mysqli->connect_error() ."</p>"); 
} 

添加一些過濾器,以您的變量

  1. 對網址進行解碼,因爲您正在使用$_GET,這很重要以防您的瀏覽器在發佈變量時對其進行編碼。
  2. htmlentities將確保沒有html標籤並防止代碼被運行。

這將是這樣的:

$firstName = urldecode(htmlentities($_GET["fname"])); 
$lastName = urldecode(htmlentities($_GET["lname"])); 
$jobTitle = urldecode(htmlentities($_GET["jobName"])); 

現在讓我們看看一些重要的變化:

// let's start changing your query here 
// use prepared statements 
$queryString = "SELECT jobName, description, posType, basePay FROM Titles WHERE jobName = ?"; 

然後,你必須準備查詢

if($stmt = $mysqli->prepare($queryString)) { 
    //bind the parameter of `jobName` 
    $stmt->bind_param('s', $jobName); 
    // execute the query 
    $stmt->execute(); 

    // get all of the results 
    $results = $stmt->get_result(); 
    // fetch the results in an associative array 
    $row = $result->fetch_assoc(); 

    // close stmt connection 
    $stmt->close(); 
} else { 
    $error = array(
     'is_error' => true, 
     'error' => 'There was a problem preparing the SQL' 
    ); 

    print_r($error); 
} 

現在你有所有的$row數組中的記錄都可以用它來做你需要的。您可以通過打印整個陣列確保數據在那裏:

print_r($row); 

乾杯!