我在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);
}
}
答案 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有更全面的描述。这是一个比我上面提到的更好的解决方案,但你还有很多工作要做。