【问题标题】:Query works fine in phpmyadmin returns 0 rows when ran from php查询在 phpmyadmin 中工作正常从 php 运行时返回 0 行
【发布时间】:2011-01-15 00:09:28
【问题描述】:

我真的被这件事难住了。这是php:

更新:我已经转义了输入(在我以不同的方式执行此操作之前,但不知道 mysql_real_escape_string)。另外,我用单引号替换了双引号,但同样的问题正在发生。以下是更新后的代码:

$request = mysql_real_escape_string($_POST['id']);
$colName = mysql_real_escape_string($_POST['col_name']);

function executeAssoc1($q)
{
    $r = mysql_query($q) or die(mysql_error() . ' ' . $q);
    $rass = mysql_fetch_assoc($r);
    return $rass;
}

foreach(array_keys($_POST) as $pitem)
{

    if($pitem == (...what I want it to...))
    {
        $pitem_name = mysql_real_escape_string(rawurldecode($pitem));

        $qf = "SELECT * FROM possible_values WHERE table_id=$request AND col_name='$colName' AND value = '$pitem_name'";
        $qfr = executeAssoc1($qf);
        var_dump($pitem_name);
        echo '<br>';
        var_dump($qf);
        echo '<br>';
        var_dump($qfr);
    }

}

这是该代码在一个循环中输出的部分内容:

string(37) "1 .New England(东北地区)"
string(122) "SELECT * FROM possible_values WHERE table_id=3 AND col_name='DIVISION' AND value = '1 .New England (Northeast region)'"
布尔(假)

现在,当我将该查询复制到 phpmyadmin SQL 编辑器中时,它实际上会返回一个结果。我什至尝试按照here 中的建议使用 LIKE "%...%" 但同样的事情发生了(phpmyadmin 返回一行,php 返回 0 行)。

【问题讨论】:

  • 逃离你的字符串!这需要 SQL 注入!
  • 修复了注入问题(希望如此)
  • 您是否 100% 确定您使用的是相同的数据库连接、数据库和表?
  • 你试过用分号吗?在 mysqli 中,这是一个 nono,但我不记得它在旧 ext 中是如何工作的......
  • @Pekka 是的,我确定我使用了正确的连接、数据库和表。实际上有一些查询是成功的,比如这个: SELECT * FROM possible_values WHERE table_id=3 AND col_name='DIVISION' AND value = '0'

标签: php mysql phpmyadmin


【解决方案1】:

来自rawurldecode()上的手册:

注意:rawurldecode() 不会将加号 ('+') 解码为空格。 urldecode() 可以。

如果你输出你的 mySQL 查询,我敢打赌你的字符串看起来像这样:

1+.New+England+(Northeast+region)

按照手动输入的建议尝试 urldecode()。

【讨论】:

  • 啊,这让我找到了最终的原因。出于某种原因,我的帖子用下划线替换了句点,所以我告诉 php 对字符串进行 urlencode 并进一步执行 str_replace('.','.',$str) 来修复句点。问题是我没有再次解码这个时期,所以实际的 html 显示为“... AND value = '1 .New England (Northeast reg ...”。Grrr,现在它可以工作了。谢谢你帮助。
【解决方案2】:

你应该使用单引号而不是双引号,即:

SELECT * FROM possible_values WHERE table_id=3 AND col_name='DIVISION' AND value = '1 .New England (Northeast region)'

【讨论】:

    【解决方案3】:

    SQL 中的字符串不允许使用双引号,因为它们用于标识符(如 MySQL 使用反引号 '`')。我认为 MySQL 允许它们用于具有某些设置的字符串,但您不应该使用它们。

    从技术上讲,这应该返回一个错误,所以我认为这不是你的问题。

    您的问题可能是您使用的是旧的 mysql 扩展,它可能不支持您的 mysql 版本。

    【讨论】:

    • 我不这么认为。我正在运行 MySQL 客户端版本:5.0.51b 和 PHP 版本 5.2.6 和 phpMyAdmin - 2.11.7
    • 我记得很多次人们在使用旧的 mysql 扩展时遇到问题......那为什么要使用它呢?使用 mysqli。
    【解决方案4】:

    可能是笔误,但是

    table_id=$request
    

    应该有引号:

    table_id='$request'
    

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2017-08-16
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2017-07-17
      • 2018-10-31
      相关资源
      最近更新 更多