查询不会从函数内运行

时间:2014-11-15 22:36:23

标签: php mysql pdo

我试图删除其中一个文件中的冗余。我有30到40个查询---两种不同的类型---根据日期运行。我试图通过将它们放在一个函数中并根据日期调用函数来避免重复相同(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()语句触发了函数,但函数没有运行查询,但 fopen 代码会创建预期的文本文件。

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

感谢。

3 个答案:

答案 0 :(得分:0)

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

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");
} 

答案 1 :(得分:0)

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

"(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解释器会警告您这些类型的事情。

答案 2 :(得分:-1)

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

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(); 
}