2017-12-03 237 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); 

干杯!