【问题标题】:mysqli php table names with hyphen or space带有连字符或空格的mysqli php表名
【发布时间】:2013-05-30 13:29:20
【问题描述】:

该网站旨在显示某些司法管辖区的法律/规则。

有一个简单的 mysqli 查询可以找到县,然后在屏幕上显示县名:

echo "><a href=\"index.php?sel_subj=" . urlencode($subject["county_name"]) . "\">
{$subject["county_name"]}</a></li>";

然后单击县名(嵌入链接),mysqli 查询应该查找具有该县名的表并获取该县内的所有司法管辖区。

if (isset($_GET['sel_subj'] )){
  $query2 = "SELECT * FROM $sel_subj";
  $result2 = $mysqli2->query($query2) or die($mysqli2->error.__LINE__);
    while ($subject = mysqli_fetch_array($result2)) {
      echo "<li";
      echo "><a href=\"index.php?sel_page=" . urlencode($subject["muni_name"]);
      echo "&sel_subj=" . urlencode($sel_subj). "\">
      {$subject["muni_name"]}</a></li>";
    }
}

问题是某些县名包含空格或连字符。因此,当我单击带有连字符或空格的县时,会出现错误。

当有连字符时出现此错误(例如:Miami-Dade): 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 173 行的“-Dade”附近使用正确的语法

当有空格时出现这个错误(例如:Palm Beach): 表“florida.palm”不存在73

如果县只是一个没有任何特殊字符的字符串,那么显示辖区没有问题。

有没有简单的解决办法?

【问题讨论】:

  • 您确定要向黑客提供 THAT 大小的漏洞吗?
  • $sel_subj 的值在哪里设置
  • @Anigel 也许全局变量已打开。其中,user2436671,你应该照顾好。
  • @MaX 这是可能的,但不太可能,因为在包含 mysqli 函数之前,默认情况下已禁用寄存器全局变量。
  • 是的。他说他对不包含特殊字符的名称有很好的结果,所以变量显然有一个值,只是给它一个猜测。

标签: php mysqli names


【解决方案1】:

您的数据库结构错误。

它必须是 ONE 表,其中国家是其他列中的一个字段。

所以,代码必须是这样的

if (isset($_GET['sel_subj'] )){
  $query = "SELECT * FROM documents WHERE country = ?";
  $stmt  = $mysqli->prepare($query) or trigger_error($mysqli->error);
  $stmt->bind_param('s',$_GET['sel_subj']);
  $stmt->execute();
  $res = $stmt->get_result();
  while ($subject = mysqli_fetch_array($res)) {
      echo "<li";
      echo "><a href=\"index.php?sel_page=" . urlencode($subject["muni_name"]);
      echo "&sel_subj=" . urlencode($sel_subj). "\">
      {$subject["muni_name"]}</a></li>";
    }
}

【讨论】:

    【解决方案2】:

    如果您的县名包含这样的字符,您必须将其包装起来。但是,您还需要清理您的输入:

    $query2 = "SELECT * FROM `".mysqli_real_escape_string ($sel_subj)."`";
    

    编辑:

    另外,您应该查看 prepared statements 以避免 sql 注入。

    您应该通过将可以定义的表名限制为包含县信息的表名来进一步清理您的输入。

    【讨论】:

    • 请不要! mysqli_real_escape_string notprepared 语句都不能帮助防止此处注入
    • 我只是说...由于他对动态表名的特殊需求,其中表名可能包含空格,这就是您必须做的。我并不是说这是一个很好的解决方案,但这是他需要和要求的。
    • 感谢您的意见。我看到很多人谈论 sql injection 和prepared statements,但不知道如何在考虑这些事情的情况下进行构建。我只是从书籍、网页中获取代码 sn-ps 并串在一起来开发这个站点。你知道这些东西有什么好的教程或解释吗?
    • 您可以查看我在答案中发布的链接,了解如何使用准备好的语句。关于 sql 注入,有很多不同的内容可供阅读。只要去谷歌搜索它,你会发现很多材料。简而言之,就是防止用户在你的 sql 语句中执行 sql,通常是直接使用表单的输入。
    • 如何使用准备好的语句简单地列出数据库中的表?我现在有这段代码,但它不起作用... $stmt = $conn->prepare("SHOW TABLES FROM subject"); $stmt->执行(); $stmt->store_result(); while($stmt->fetch()): $table_name=ucwords($row[0]); echo "
    • {$table_name}
    • ";结束;
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签