【问题标题】:Using $_POST in mySQL query在 mySQL 查询中使用 $_POST
【发布时间】:2013-11-26 18:53:30
【问题描述】:

我正在尝试创建一个程序,用户将在表单字段中输入州缩写,输出将是该州的大学。这是我的代码:

<?php
$abbr = $_POST;
print_r ($abbr);
$host='x';
$dbname='x';
$user='x';
$pass='x';
try {
  # MySQL with PDO_MYSQL
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e) {
    echo $e->getMessage();
}

$STH = $DBH->query("
SELECT INSTNM, STABBR
FROM colleges
WHERE STABBR ='$abbr'
");

# setting the fetch mode
$STH->setFetchMode(PDO::FETCH_ASSOC);

while($row = $STH->fetch()) {
    echo $row['INSTNM'] . "\n";
    echo $row['STABBR'] . "<br>";
}
?>

输出:

Array ( [STABBR] => AL ) 

当州缩写被硬编码时,程序可以正常工作。例如,如果我这样做:

$STH = $DBH->query("
SELECT INSTNM, STABBR
FROM colleges
WHERE STABBR ='AL'
");

...阿拉巴马州的大学将出现。

我尝试了很多方法,但到目前为止都没有奏效。感谢您的帮助。

【问题讨论】:

  • 通过使用外部变量构建 SQL 语句,您很容易受到 SQL 注入攻击。 此外,任何带有单引号的输入数据,例如 " O'Malley”,会炸毁你的 SQL 查询。请了解如何使用参数化查询(最好使用 PDO 模块)来保护您的 Web 应用程序。 bobby-tables.com/php 有示例可以帮助您入门,this question 有很多详细示例。

标签: php mysql sql forms post


【解决方案1】:

如您的输出所示,$_POST 是一个数组,而不是单个元素。

使用

$abbr = mysql_real_escape_string($_POST['STABBR']);

既要获得正确的元素,又要防止注入攻击。

【讨论】:

    【解决方案2】:

    这是不正确的:

    $abbr = $_POST;
    $sql = " .... = '$abbr'";
    

    $_POST 是一个数组,当你在字符串上下文中直接使用数组时,你得到的字面量是“Array”,所以你的查询实际上是

    $sql = " .... = 'Array'";
    

    您需要使用表单字段元素的名称:

    <input type="text" name="state" value="AL" />
                             ^^^^^---field name
    $abbr = $_POST['state'];
                    ^^^^^--- field name again
    

    另请注意,您很容易受到SQL injection attacks 的攻击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2012-10-12
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多