【问题标题】:Query Won't Run From Within Function查询不会从函数内部运行
【发布时间】:2015-01-13 02:47:57
【问题描述】:

我正在尝试删除我的一个文件中的冗余。我有 30 到 40 个查询——2 种不同类型——根据日期运行。我试图通过将它们放在一个函数中并根据日期调用该函数来避免重复相同的(2 个不同的)查询字符串。它似乎没有像我预期/希望的那样工作。我是 PHP 新手,也许我忽略了一些东西或者不明白 PHP 函数是如何工作的。

这里是代码示例:

function queryONE() { 
    $stmt = $pdo->query("SELECT `rand` FROM `setGallery` WHERE `$category` = '$dayList' ORDER BY RAND() LIMIT $limit"); 
    $fh = fopen("galleryRand_PDO.txt", "w"); 
    while ($row = $stmt->fetchObject()) {
        fwrite($fh, $row->rand);
    } 

    fclose($fh); 

    exit();
}

function queryTWO() { 
    $stmt = $pdo->query("(SELECT `rand` FROM `jukebox2014` WHERE `$category` = '$dayList' ORDER BY RAND() LIMIT $limit) ORDER BY `rand` DESC"; 
    $fh = fopen("galleryRand_PDO.txt", "w"); 

    while ($row = $stmt->fetchObject()) {
        fwrite($fh, $row->rand);
    }

    fclose($fh); 

    exit(); 
}

if ($date == Jun 13)
{
    $category = "galleryDir"; 
    $dayList = "Grids";
    queryONE();
} 

if ($date == Nov 16) {
    $category = "class"; 
    $dayList = "Grids"; 
    queryTWO();
}

注意:如果我放一个 --- echo "Hello world!" --- 在它显示的函数中声明;所以 if() 语句触发了函数,但函数没有运行 query,但 fopen 代码确实创建了预期的文本文件。

显然还有很多 if() 语句,否则我不会打扰。任何想法为什么这不起作用?

谢谢。

【问题讨论】:

  • 请正确格式化您的代码
  • 启用正确的error reporting;阅读variable scope
  • 你怎么知道查询没有运行?你到底什么意思?结果集是否为空?
  • 我认为它是空的,因为没有任何内容输出到文本文件。当我在函数之外运行任何一个查询时,都会填充文本文件——所以我知道查询代码正在工作。

标签: php mysql pdo


【解决方案1】:

查询失败,因为变量没有数据。如果您在执行之前回显查询的内容,您将看到如下内容:

"(SELECT `rand` FROM `jukebox2014` WHERE `` = '' ORDER BY RAND() LIMIT ) ORDER BY `rand` DESC"

这是因为函数queryOnequeryTwo 对这些变量一无所知;它们超出了范围。

要使变量在这些函数的范围内,您需要将它们作为参数传递。一、修改函数定义接受参数:

function queryONE($category, $daylist, $limit) { ...

function queryTWO($category, $daylist, $limit) { ...

然后修改调用函数传递参数的那一行:

queryONE($category, $dayList, $limit);
queryTWO($category, $dayList, $limit);

现在变量将可用于函数(“范围内”)。您的代码不会显示您定义 $limit 的位置,但请确保在您调用新函数时它在范围内。

最后,考虑开启error reporting。如果您允许,PHP 解释器会警告您这些类型的事情。

【讨论】:

  • 我不知道为什么这个答案有一个反对意见(因为所有答案都有一个我怀疑是巨魔),但这个答案 1)解释了问题 2)给出了修复和 3)显示如何防止它在未来发生。 +1。
【解决方案2】:

尝试将日期作为参数传递给您的函数,如下所示:

function queryONE($category, $dayList) { 
    $stmt = $pdo->query("SELECT `rand` FROM `setGallery` WHERE `{$category}` = '{$dayList}' ORDER BY RAND() LIMIT $limit"); 
    $fh = fopen("galleryRand_PDO.txt", "w"); 
    while ($row = $stmt->fetchObject()) {
        fwrite($fh, $row->rand);
    } 

    fclose($fh); 

    exit();
}

然后调用方法:

 if ($date == Jun 13)
{
    queryONE("galleryDir", "Grids");
} 

【讨论】:

  • Category 不能以这种方式进入函数。此外,在 if 中设置 $dayList 没有意义。 (这也适用于$category。)
【解决方案3】:

您想将类别和日期列表传递给函数:

queryONE("galleryDir", "Grids");
queryONE("class", "Grids");

并相应地定义功能:

function queryONE($category, $dayList) { 
    $stmt = $pdo->query("SELECT `rand` FROM `setGallery` WHERE `$category` = '$dayList' ORDER BY RAND() LIMIT $limit"); 
    $fh = fopen("galleryRand_PDO.txt", "w"); 
    while ($row = $stmt->fetchObject()) {
        fwrite($fh, $row->rand);
    } 

    fclose($fh); 

    exit();
}

function queryTWO($category, $dayList) { 
    $stmt = $pdo->query("(SELECT `rand` FROM `jukebox2014` WHERE `$category` = '$dayList' ORDER BY RAND() LIMIT $limit) ORDER BY `rand` DESC"; 
    $fh = fopen("galleryRand_PDO.txt", "w"); 

    while ($row = $stmt->fetchObject()) {
        fwrite($fh, $row->rand);
    }

    fclose($fh); 

    exit(); 
}

【讨论】:

  • 我认为我已经实施了您的建议。但它们似乎不起作用。 if ($today == "11 月 15 日"){ $category = "images"; $dayList = "玫瑰"; $限制 = 1; queryONE($category, $dayList, $limit); } function queryONE($category, $dayList, $limit) { echo "help!"; $stmt = $pdo->query("SELECT rand FROM setGallery WHERE $category = '$dayList' ORDER BY RAND() LIMIT $limit"); $fh = fopen("galleryRand_PDO.txt", "w"); while ($row = $stmt->fetchObject()) { fwrite($fh, $row->rand); } fclose($fh);出口(); } 没有函数相关的代码,它可以工作。谢谢。
猜你喜欢
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2022-08-18
  • 2022-10-13
相关资源
最近更新 更多