这是对我上一个问题(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;与`。
答案 0 :(得分:1)
由于SQL字符串注入和缺少占位符,程序传入 bogus 查询字符串。
SELECT calculatePrice(Cheddar, Ham, Carrot);
.. 不是有效的SQL:那些应该是字符串文字,而不是[未绑定]列标识符。
扩展: MySQL期待此处的列或表达式,而Cheddar
,Ham
和Carrot
不是列在当前的SQL语句中。它们也是不是表达式(如'Cheddar'
或1 + 41
)。这就是为什么错误消息显示“未知列'cheddar'”,因为此语句中没有绑定此列。
虽然确保函数获取 string 值的一种方法是在生成SQL语句there are better approaches described here时添加'
。
此外,验证它不需要也有结果列名称,例如select calculatePrice(..) as colName
,至少在SQL Server中