PHP将变量传递给我自己的MySQL函数 - 使用变量作为列名称的DB

时间:2012-10-19 01:22:17

标签: php mysql function mysqli

这是对我上一个问题(http://stackoverflow.com/questions/12945119/mysql-function-add-prices-from-multiple-tables)的跟进,所以MySQL代码就在那里。我的DB背景是SQL Server 2008和Access,所以MySQL的特性越来越好。我已经用脑子搜索了我的脑袋,在StackOverflow,StackExchange的编程和网络开发板等上阅读了每个甚至模糊相关的Q& A(不得不放弃免责声明。)

我在DreamCoder中运行了这个函数,当它只是提示我输入然后运行函数时,它会返回正确的答案(小数点),所以函数的逻辑是合理的,据我所知。但是,当我尝试从PHP调用该函数时,它会出错。

数据库访问代码如下:

function getQuote($json)

echo("JSON input: ");
var_dump($json);

    $array = json_decode($json, TRUE);
    echo("JSON decoded array: ");
    print_r($array);

    $cheese = $array[0];
    $meat = $array[1];
    $veg = $array[2];   

    $c = db_connect();
    $query = "SELECT calculatePrice($cheese, $meat, $veg)";
    var_dump($query);
    $result  = mysql_query($query , $c);
    if(!$result)
    {
        echo "\nCould not successfully run query ($query) from DB: " . mysql_error();
        exit;
    }

if (mysql_num_rows($result) == 0) {
    echo "No rows found, nothing to print so am exiting";
    exit;
}

while($row = mysql_fetch_assoc($result)){
    echo("Row: ");
    var_dump($row);

    if(!$row)
        die("No price returned!" . var_dump($row));
    else
    {   
        return json_encode($row);   
    }
}  //end while

我写了以下"测试安全带"手动输入数据。我知道JSON正确,因为完整代码会逐字提供相同的错误,因此问题可能是PHP或MySQL。

    <?php
        require_once 'DBUtils.php';

    $array = array();
    $array[] = "Chedder";
    $array[] ="Ham";
    $array[] ="Carrot";

    $json = json_encode($array);
    echo("JSON object:");
    var_dump($json);

    $test = getQuote($json);

        echo("Test: ");
        print_r($test);

    ?>

我也试过MySQLi,同样的交易,同样的错误。根据MySQL的文档,虽然很少,但我正确调用函数并正确传递变量。 (PHP的文档几乎不存在;他们的例子都是&#34; SELECT *来自tblFoo WHERE bar = 4。&#34;)

错误在于它将chedder视为列名而不是变量:&#34; Unknown column&#39; cheddar&#39;在&#39;字段列表&#39;&#34;。我错过了什么?

我可以在SQLServer和ASP.NET中做到这一点,但不会引起注意,但是MySQL / PHP让我的企鹅混淆了X_X(不是Linux企鹅,只是动物园类型。)

PHP版本是5.3.17,MySQL是5.1,以防万一。我认为PHP 5.4。*有一些相关的方法,但在我经历改变我的PHP版本的麻烦之前,我宁愿用尽任何5.3。*选项。

我很清楚答案可能是显而易见的,并且知道,一旦我了解了我正在做的事情,没有人会因为自称愚蠢而超越我。

再次感谢你!这个网站在Google之前的地方很近,因为问题^ _ ^(至少有2/3的结果可以解决我从这里问到的任何谷歌问题= -p)

编辑: 确定MySQL单独工作(从等等中选择...)原来它想要&#39;与`。

1 个答案:

答案 0 :(得分:1)

由于SQL字符串注入和缺少占位符,程序传入 bogus 查询字符串。

SELECT calculatePrice(Cheddar, Ham, Carrot);

.. 不是有效的SQL:那些应该是字符串文字,而不是[未绑定]列标识符。

扩展: MySQL期待此处的列或表达式,而CheddarHamCarrot 不是列在当前的SQL语句中。它们也是不是表达式(如'Cheddar'1 + 41)。这就是为什么错误消息显示“未知'cheddar'”,因为此语句中没有绑定此列。

虽然确保函数获取 string 值的一种方法是在生成SQL语句there are better approaches described here时添加'

此外,验证它不需要也有结果列名称,例如select calculatePrice(..) as colName,至少在SQL Server中