【问题标题】:php mysql based on user input form基于用户输入表单的php mysql
【发布时间】:2013-08-02 14:36:58
【问题描述】:

我在使用复选框选择一个或多个数据字段供 PHP/AJAX 处理和显示时遇到问题。我的 PHP/AJAX 在我的 <select>s 上运行良好,但是一旦我尝试设置复选框,所有的地狱都会失败。

我也非常不确定如何进一步防止网站上的 SQL 注入,所以如果有人可以向我提供更多关于这方面的信息,我将不胜感激!我阅读了我提供的链接,只是不明白bid_param 或 PDO 是如何工作的。

ajax 脚本: (我似乎无法插入 ajax/js,所以我会留下一个指向实时站点的链接)

Link to Agent search page

我的显示数据的php页面:

<div id="bodyA">
    <h1>Find a Local OAHU Agent.</h1>
    <!-- This is where the data is placed. -->  
</div>
<div id="sideB">
    <div class="sideHeader">
        <em>Advanced Search</em>            
    </div>
    <form class="formC">
        <label for="last">Last Name</label><br />
        <select id="last" name="Last_Name" onChange="showUser(this.value)">
<?php 
    include 'datalogin.php';

    $result = mysqli_query($con, "SELECT DISTINCT Last_Name FROM `roster` ORDER BY Last_Name ASC;");
    echo '<option value="">' . 'Select an Agent' .'</option>';
    while ($row = mysqli_fetch_array($result)) {
        echo '<option value="'.$row['Last_Name'].'">'.$row['Last_Name'].'</option>';
    }
?>
        </select>
        <label for="company">Company</label><br />
        <select id="company" name="users" onChange="showUser(this.value)">
<?php 
    include 'datalogin.php';

    $result = mysqli_query($con, "SELECT DISTINCT Company FROM `roster` ORDER BY Company ASC;");
echo '<option value="">' . 'Select a Company' .'</option>';
    while ($row = mysqli_fetch_array($result)) {
        if ($row['Company'] == NULL) {
        } else {
            echo '<option value="'.$row['Company'].'">'.$row['Company'].'</option>';
        }
    }
?>
        </select>
        <label for="WorkCity">City</label><br />
        <select id="WorkCity" name="WorkCity" onChange="showUser(this.value)" value="city">
<?php 
    include 'datalogin.php';

    $result = mysqli_query($con, "SELECT DISTINCT WorkCity FROM `roster` ORDER BY WorkCity ASC;");
    echo '<option value="">' . 'Select a City' .'</option>';
    while ($row = mysqli_fetch_array($result)) {
        echo '<option value="'.$row['WorkCity'].'">'.$row['WorkCity'].'</option>';
    }
?>
        </select>
        <label for="WorkZipCode">Zip Code</label><br />
        <select id="WorkZipCode" name="WorkZipCode" onChange="showUser(this.value)">
<?php 
      include 'datalogin.php';

      $result = mysqli_query($con, "SELECT DISTINCT WorkZipCode FROM `roster` ORDER BY WorkZipCode + 0 ASC;");
      echo '<option value="">' . 'Select a Zip Code' .'</option>';
      while ($row = mysqli_fetch_array($result)) {
          echo '<option value="'.$row['WorkZipCode'].'">'.$row['WorkZipCode'].'</option>';
      }
?>
        </select>
        <label for="agent">Agent Expertise</label><br />
        <label for="ancillary"><input type="checkbox" value="Ancillary" name="Ancillary[]" id="ancillary" />Ancillary</label><br />
        <label for="smallgroup"><input type="checkbox" value="Smallgroup" name="Smallgroup[]" id="smallgroup" />Small Group</label><br />
        <label for="largegroup"><input type="checkbox" value="LargeGroup" name="LargeGroup[]" id="largegroup" />Large Group</label><br />
        <label for="medicare"><input type="checkbox" value="Medicare" name="Medicare[]" id="medicare" />Medicare</label><br />
        <label for="longterm"><input type="checkbox" value="LongTerm" name="LongTerm[]" id="longterm" />Long Term Care</label><br />
        <label for="individual"><input type="checkbox" value="Individual" name="Individual[]" id="individual" />Individual Plan</label><br />
        <label for="tpa"><input type="checkbox" value="TPASelfInsured" name="TPASelfInsured[]" id="tpa" />TPA Self Insured</label><br />
        <label for="ppaca"><input type="checkbox" value="CertifiedForPPACA" name="CertifiedForPPACA[]" id="ppaca" />Certified for PPACA</label><br />
    </form>
</div>

我的 php 页面提取信息并将其放入页面上的容器中:

    $q = (isset($_GET['q'])) ? $_GET['q'] : false; // Returns results from user input

    include 'datalogin.php'; // PHP File to login credentials

    $sql="SELECT * FROM `roster` WHERE Company = '".$q."' OR Last_Name = '".$q."' OR WorkCity = '".$q."' OR WorkZipCode = '".$q."' ORDER BY Last_Name ASC";

    $result = mysqli_query($con,$sql) // Connects to database or die("Error: ".mysqli_error($con));

    echo "<h1>" . "Find a Local OAHU Agent." . "</h1>";

    while ($row = mysqli_fetch_array($result)) { // Gets results from the database
                echo "<div class='agentcon'>" . "<span class='agentn'>" . "<strong>".$row['First_Name'] . "&nbsp;" .$row['Last_Name'] . "</strong>" . "</span>" . "<a href=mailto:".$row['Email'] . ">" . "<span class='email'>".$row['Email'] . "</span>" . "</a>" ."<div class='floathr'></div>";
                if ($row['Company'] == NULL) {
                    echo "<p>";
                }
                else {
                    echo "<p>" . "<strong>" .$row['Company'] . "</strong>" . "<br>";
                }
                echo $row['WorkAddress1'] . "&nbsp;" .$row['WorkCity'] . "," . "&nbsp;" .$row['WorkStateProvince'] . "&nbsp;" .$row['WorkZipCode'] . "<br>";
                if ($row['Work_Phone'] !== NULL) {
                    echo "<strong>" . "Work" . "&nbsp;" . "</strong>" .$row['Work_Phone'] . "<br>";
                }
                if ($row['Fax'] !== NULL) {
                    echo "<strong>" . "Fax" . "&nbsp;" . "</strong>" .$row['Fax'] . "<br>";
                }
                echo "<strong>" . "Agent Expertise:" . "</strong>";
                if ($row['Ancillary'] == 1) {
                        echo "&nbsp;" . "Ancillary" . "/";
                }
                if ($row['SmallGroup'] == 1) {
                        echo "&nbsp;" . "Small Group" . "/";
                }
                if ($row['IndividualPlans'] == 1) {
                        echo "&nbsp;" . "Individual Plans" . "/";
                }
                if ($row['LongTermCare'] == 1) {
                        echo "&nbsp;" . "Long Term Care" . "/";
                }
                if ($row['Medicare'] == 1) {
                        echo "&nbsp;" . "Medicare" . "/";
                }
                if ($row['LargeGroup'] == 1) {
                        echo "&nbsp;" . "LargeGroup" . "/";
                }
                if ($row['TPASelfInsured'] == 1) {
                        echo "&nbsp;" . "TPA Self Insured" . "/";
                }
                if ($row['CertifiedForPPACA'] == 1) {
                        echo "&nbsp;" . "Certified For PPACA";
                }
                echo "</p>" . "</div>";
    }
    mysqli_close($con);
?>

感谢有关此主题的所有帮助!每当我将复选框值添加到我的 php 文件时,它最终都会在数据库中显示表单中所有字段的每个人。

我也试图阻止 sql 注入,但如果我没有用户可以输入文本的字段,用户怎么能做到这一点?

编辑截至今天,我尝试使用 jQuery 来激活复选框,然后调用一些 AJAX。 这是我编写的脚本,它正在拉动一个代理,而不是每个拥有这种“专业知识”的人。

$('input').click(function() {
        $.ajax({
            url: "process.php",
            data: { value: 1},
            success: function (data) {
                $('#bodyA').html(data);
            }
        });
    });

【问题讨论】:

  • 在编写 任何 更多 SQL 代码之前,您必须阅读 proper SQL escaping 以及如何使用 bind_param 正确插入来自$_GET 进入您的查询,而不会造成严重的 SQL injection bugs
  • 是的,完全同意这一点,您不希望人们从这样的漏洞中获得未经授权的访问。
  • 好的,我正在阅读此页面,但就像我说的那样,我对 sql 完全陌生,甚至通常使用数据库。介意给我一个关于 bind_param 的稍微细分的解释吗?
  • RE:PHP,还有一些不好的做法。如果您在else 中没有任何事情可做,请不要编码一。此外,如果您在IF 中无事可做,但您在else 中确实有事可做,则更改IF 中的测试,这样您就没有带有ELSE 的空IF 语句。它将使您的代码更易于阅读和理解,因此在您必须尝试再次理解它的 6 个月内更易于维护。
  • 嗯好吧,我明白你对 else 语句的意思,但是当我只使用 if 语句并且该字段为空时,它会在结果中包含一个空行。这就是为什么我使用空的 if 语句和 else 语句来回显结果。

标签: php mysql ajax


【解决方案1】:

这是我最近工作的一个快速示例,我需要遍历多个复选框并将这些值传递到 SQL 语句中。尽管此示例发生在单击按钮时,但希望它与您要完成的任务相似,或者至少在开始时... :)

<?php
$array = array();
if (isset($_POST['medicare'])) {
    foreach ($_POST['medicare'] as $value) {
        array_push($array, $value);
    }
}
// this will return the value of each selected checkbox, separating each with a comma
$result = implode(",", $array);

// if you want to loop through each individually (for example pass each into a SQL statement)
foreach ($_POST['medicare'] as $value) {
    // Do your SQL here 
    // $value will be the value of each selected checkbox (Smallgroup, Largegroup, etc.)
    $sql = "insert into tablename(fieldname) values ('$value')"; // just an example
}
?>

<input type="checkbox" name="medicare[]" id="smallgroup" value="Smallgroup" />
<label for="smallgroup">Small Group</label>
<br />
<input type="checkbox" name="medicare[]" id="largegroup" value="Largegroup" />
<label for="largegroup">Large Group</label>
<br />
<input type="checkbox" name="medicare[]" id="medicare" value="Medicare" />
<label for="medicare">Medicare</label>
<br />
<input type="checkbox" name="medicare[]" id="individualplan" value="IndividualPlan" />
<label for="individualplan">Individual Plan</label>
<br />
<input type="submit" value="Submit" id="btnSubmit" name="btnSubmit" />

更新

不要设置一个变量,而是尝试为每个select 控件设置一个变量并将您的SQL 语句放入foreach 循环中。我只是用一些虚拟数据对此进行了测试,没有任何问题。

<?php
$lastname = (isset($_GET['Last_Name'])) ? $_GET['Last_Name'] : false;
$users = (isset($_GET['users'])) ? $_GET['users'] : false;
$workCity = (isset($_GET['WorkCity'])) ? $_GET['WorkCity'] : false;
$WorkZipCode = (isset($_GET['WorkZipCode'])) ? $_GET['WorkZipCode'] : false;

foreach ($_GET['medicare'] as $value) {
    //echo $value;
    $sql="SELECT * FROM roster WHERE Company = '$users' OR Last_Name = '$lastname' OR WorkCity = '$workCity' OR WorkZipCode = '$WorkZipCode' OR Ancillary = '$value' ORDER BY Last_Name ASC";
}
...continue as you were...
?>

【讨论】:

  • 感谢您的回复!可悲的是,我一直在尝试这个,它最终什么也没做,甚至没有给我任何错误,所以我不确定该怎么做。我不知道为什么这个这么难,呵呵,使用选择字段非常容易,并没有让我想拔头发。
  • 您是否尝试回显结果以查看是否有任何返回?
  • 是的,我做到了,我希望它至少会显示一些东西或错误。这是我正在处理的实时站点的链接,link。前四个select 字段工作得很好,但是一旦我试图摆弄 Agent Expertise 区域,整个脚本就会变得疯狂。与我裸露,因为结构设计不是我的,但其他一切都是:}
  • 您如何检测复选框何时被选中/取消选中?似乎正在发生一些事情,因为如果我在选中辅助选项的情况下更改 4 个选择中的任何一个,然后取消选中辅助选项,页面就会更新。如果我对任何其他复选框尝试相同的步骤,则页面不会更新...您需要验证在选中/取消选中时是否检测到每个复选框。我看到您正在为选择进行 onChange,但是您是否使用 jQuery 并进行 ajax 调用来检测复选框?
  • 查看我的更新。我认为您只需要为每个选择分配一个变量并将 SQL 放入一个循环中,以便您每次都传递正确的值。
【解决方案2】:

我做到了!!哇!我最终只制作了一个名为expertise.php 的单独php 页面来使用jquery/ajax 处理复选框。

实现这一点的 jQuery:(感谢上帝,我上 jQuery 网站查找函数!)

$('input').click(function() {
        $.ajax({
            url: "expertise.php",
            data: { value: 1},
            success: function (data) {
                $('#bodyA').html(data);
            }
        });
    });

PHP页面和我的process.php页面一样,除了sql:

$sql="SELECT * FROM `roster` WHERE Ancillary = '1' AND SmallGroup = '1' AND CertifiedForPPACA = '1' ORDER BY Last_Name ASC";

如果有人能告诉我更多关于如何更好地防止 sql 注入的问题,请随意!

Agent Search Page

好吧,我至少让搜索的两个部分都能正常工作,但出现了一个新问题:p

现在在 sql 中,我可以使用 AND 或 OR,与 AND 一起使用它只会拉动拥有所有这些专业知识的代理,而使用 OR 似乎会拉动所有人。有什么想法吗?

【讨论】:

  • 干得好!这接近于我即将更新我的答案(使用 ajax 方法)。在我更新之前正在做一些最终测试,但看起来你打败了我!
  • @Brian 非常感谢!我对第一次使用 php 的结果感到非常自豪。我仍然对我得到的结果有一个小问题。在 sql 中使用 AND 只给我具有所有这些字段的代理,使用 OR 给我所有代理,有什么想法吗?
  • 使用 AND,只有满足所有条件的结果才会返回。使用 OR 可以进行更广泛的搜索,从而获得更多结果。我猜您想知道何时使用哪个复选框值?如果是这样(并且我理解正确),我最初关于用逗号分隔它们的建议应该可行,但您将使用 SQL 的 IN 而不是 =。类似..."Ancillary IN ('Largegroup', 'Smallgroup') ORDER BY Last_Name ASC。请注意,我绝不是 SQL 专家,这只是基于此处共享信息的建议。
  • 既然您已经在这里找到了主要问题的答案,您可能想要开始一个关于 SQL 内容的新问题,因为它可能会有更多的命中作为一个新问题,您可以添加一些 SQL也给它贴上标签……不过只是一个想法。 :)
  • 我会试试你的建议,看看是否可行。如果没有,我会根据我目前的状态提出一个新问题。 :p 非常感谢你所有的帮助伙伴!它真的帮了我很多忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2015-05-19
  • 2017-01-16
  • 2011-04-08
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多