语法错误或访问冲突:1064'品牌

时间:2014-04-06 13:15:27

标签: php mysql magento

我在Magento脚本中收到此错误:

  

产品未添加例外:带有消息

的异常'PDOException'      

'SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本的正确语法使用在'秘密'附近   第1行

一些背景信息:

我在cron作业上运行PHP脚本来添加和更新产品。它现在运行了一段时间,但我刚才得到了这个错误。我认为这是因为制造商的名字中有一个撇号。但我不知道如何解决它。

不能更改制造商的名称。

function addManufacture($pid,$men){
    $resource = Mage::getSingleton('core/resource');
    $readConnection = $resource->getConnection('core_read');
    $query = "SELECT manufacturers_id FROM p1_manufacturers WHERE m_name='".$men."'";
    $lastid = $readConnection->fetchOne($query); 
    $write = Mage::getSingleton("core/resource")->getConnection("core_write");
    if($lastid){}else{
    $url = createUrl($men); 
    $query = "insert into p1_manufacturers (m_name,identifier,status) values ('".$men."','".$url."',1)";
    $write->query($query);
    $lastid = $write->lastInsertId();
    }
    $query1 = "insert into p1_manufacturers_products (manufacturers_id,product_id) values ('".$lastid."','".$pid."')";
    $write->query($query1);

    $query3 = "SELECT manufacturers_id FROM p1_manufacturers_store WHERE manufacturers_id='".$lastid."'";
    $mid = $readConnection->fetchOne($query3); 
    if($mid){} else {
    $query2 = "insert into p1_manufacturers_store (manufacturers_id,store_id) values ('".$lastid."',0)";
    $write->query($query2);
    }

}

2 个答案:

答案 0 :(得分:1)

问题在于:

$query = "SELECT manufacturers_id FROM p1_manufacturers WHERE m_name='".$men."'";

将其替换为:

$menEscaped = mysql_real_escape_string($men);
$query = "SELECT manufacturers_id FROM p1_manufacturers WHERE m_name='".$menEscaped."'";

为了便于阅读,我可能倾向于重新格式化:

$menEscaped = mysql_real_escape_string($men);
$query = "
    SELECT
        manufacturers_id
    FROM
        p1_manufacturers
    WHERE
        m_name='{$menEscaped}'
";

问题是您没有转义输入变量,如果这是来自用户输入,您可能会发现人们将自己选择的SQL注入数据库。这通常不好!

附录:以上内容可能有效,但我刚发现您使用的是名为Mage的库。在这种情况下,您需要了解如何使用该库来转义字符串 - 它将类似于$write->escapeString($men)

正如评论中所指出的那样,如果你可以改用paramerisation,那就更好了。您需要检查您的图书馆是否支持。

答案 1 :(得分:1)

您的问题是由数据中出现未转义的单引号引起的,并且在您提交给数据库的查询中出现语法错误。

不幸的是,您的数据库访问代码隐藏在某个类中,因此并不是很明显需要进行哪些更改。然而...

作为绝对最小值,您应该在将任何用户数据应用到数据库之前将其转义。对于此功能,这意味着

$men = mysql_real_escape_string($men);
$pid = mysql_real_escape_string($pid);

添加在功能的顶部。我假设你在这段代码中使用'mysql()`。

观看专栏$url = createUrl($men);,因为这会受到此更改的影响。您可能需要在此处进一步修改,createUrl()也可能需要更改。

您需要在访问数据库的每个函数中进行类似的更改。

如果您使用mysqli(),则需要更多工作,因为参数不同,这种“简单”修复无效。

最终,您应该重新编写代码以使用预准备语句。

您的代码非常容易受到攻击。这里有很多工作要做。去吧!


修改 感谢@halfer发现使用Mage。 Magento使用Zend框架,后者又使用PDO个对象。深入研究代码,您可以重写函数以使用准备好的语句来有效地处理您的问题。 This answer有更全面的描述。这是一个比我上面提到的更好的解决方案,但你还有很多工作要做。