0

我在名为 JO-dashboard.php 的 php 文件中遇到问题。它显示代码下方出现的错误。

这是我的代码:

<?php
$link = connectToDB();
$strXML = "<chart caption='Factory Output report' subCaption='By Quantity'   pieSliceDepth='30' showBorder='1' formatNumberScale='0' numberSuffix=' Units'>";   

$strQuery = "select DISTINCT profile from vgprofile";

$result = mysqli_query($link, $strQuery) or die(mysqli_error());

if($result) {
    while ($ors = mysqli_fetch_array($result)) {
        $strQuery = "select sum(MT) as totalLM from tbljocreator where PROFILE =" .    $ors['profile'];
        $result2 = mysqli_query($link, $strQuery) or die(mysqli_error());
        $getresult2 = mysqli_fetch_array($result2); 
        $strXML .= "<set label='" . $ors['profile'] . "' value ='" . $getresult2['totalLM'] . "'  />";
        mysqli_free_result($result2);
    }
}
mysqli_close($link);
$strXML .= "</chart>";

echo renderChart("FusionCharts/Column3D.swf", "", $strXML, "JoCreator", 450, 300, false, true);

?>

错误在于:

$result2 = mysqli_query($link, $strQuery) or die(mysqli_error());

在浏览器中显示:

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\xampp\htdocs\LearningFusionCharts\MyFirstChart\JO-dashboard.php on line 29
4

4 回答 4

1

mysqli_error函数需要一个参数。http://us3.php.net/mysqli_error

ps清理你的代码并使用标签:)

于 2013-11-09T07:28:29.353 回答
1

最初的问题

您必须将连接对象传递给函数mysqli_error,如下所示:

$result = mysqli_query($link, $strQuery) or die(mysqli_error($link));

和这个...

$result2 = mysqli_query($link, $strQuery) or die(mysqli_error($link));

注意:您的代码必须有另一个问题,在您执行此操作后将显示该问题。mysqli_error如果查询中没有错误或与之相关的内容,PHP 将不会执行部分。


隐藏的问题

事实上,我有理由认为*问题在于$ors['profile']字符串,因此它应该在查询字符串中的引号之间:

$strQuery = 'select sum(MT) as totalLM from tbljocreator where PROFILE = "' . $ors['profile'] . '"';

*:这在评论中得到了证实。错误是:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“铆钉”附近使用正确的语法

在这种情况下RIVETS,它的值$ors['profile']显然是一个字符串,因此它必须放在引号之间……但这并不意味着它是安全的。


SQL 注入

我们可以说您的代码是正确的,相同的代码可能适用于不同的数据。然而,由于您在查询字符串中输入的值可能并不完全安全(即使数据来自数据库),您将不得不转义危险字符。

你得到的错误证明了这一点:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“CUTTING DISC 4”附近使用正确的语法

在这种情况下,变量$ors['profile']得到了字符串CUTTING DISC 4"。此值来自数据库并导致问题。它包含4"四英寸的含义,但 Mysql 看到引号 ( ") 并认为这是字符串的结尾,并尝试将引号之后的任何内容解释为 SQL。

如果这个输入不是来自数据库,而是来自用户......那将是最糟糕的......恶意用户可以利用它在数据库中执行任意命令。这种攻击的潜力是压倒性的。

我推荐视频Hacking Websites with SQL Injection - Computerphile,它是一个很好的 SQL 注入入门介绍,适用于 Web 安全、数据库安全或一般信息安全的初学者。要了解有关这种攻击可能会做什么的更多信息,请阅读Trenton Ivey 的SQL 注入演练 (DVWA)


防止 SQL 注入 - 旧方法

解决此问题的旧方法是转义字符。\SQL 允许通过使用反斜杠字符 ( )来做到这一点。因此,在此示例中,您必须通过4\"而不是4". 但这只是冰山一角,它存在很多安全问题。

为了便于迁移,您可以做的事情是声明一个函数来清理您发送到数据库的数据,这个想法是转义任何可能的处理字符......实际上在 PHP ( mysql_real_escape_string) 中有一个函数:

$strQuery = 'select sum(MT) as totalLM from tbljocreator where PROFILE = "' . mysql_real_escape_string($ors['profile']) . '"';

旧方法的问题

但是mysql_real_escape_string已弃用并且不应该在新开发中使用(您会注意到它不是 mysqli ...),此函数本身也有一些怪癖...例如,无法告诉该函数您使用什么字符编码正在使用(它使用数据库正在使用的任何内容),并且有报告称使用多字节字符时会出现问题。这是解决这个问题的旧方法。

这里有另一个建议:Joel Spolsky的每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求。如果您不想阅读,我了解...获取另一个视频:字符、符号和 Unicode 奇迹 - Computerphile


防止 SQL 注入 - 新的和改进的方法

话虽如此,正确的解决方案是迁移到准备好的语句,使用 mysqli 并没有那么难,它会是这样的:

$strQuery = 'select sum(MT) as totalLM from tbljocreator where PROFILE = ?';
if($stmt = $link->prepare($strQuery))
{
    //s for string
    //i for integer
    //d for double (or float)
    $stmt->bind_param('s', $ors['profile']);
    if (!$stmt->execute())
    {
    die mysqli_error($link);
    }
}
else
{
    die mysqli_error($link);
}

在 PHP.net 上阅读有关准备好的语句的更多信息。

于 2013-11-09T07:31:33.607 回答
0

只是改变

mysqli_error() 

mysqli_error($link)

在它发生的每个地方。

即第4行:

$result = mysqli_query($link, $strQuery) or die(mysqli_error($link));

和第 8 行:

$result2 = mysqli_query($link, $strQuery) or die(mysqli_error($link));
于 2013-11-09T07:32:08.697 回答
0

代替

mysqli_error()

经过

mysqli_error($link)

顺便说一句,如果错误信息一样清楚,你不需要在这里问。只需阅读手册。

于 2013-11-09T07:32:26.260 回答