奇怪的MySQL错误

时间:2011-06-12 14:59:02

标签: php mysql

以下代码通过curl获取一个页面,从中提取一些字符串,更新一些MySQL列。

我的问题是,对于以下代码,我是一个错误(请参阅下面的output)。

当我复制/粘贴查询并将其放在phpmyadmin的SQL编辑器中时,它完美地运行。另外,如果我将代码中的参数$price$stockid替换为输出中列出的实际数字,它也可以。怎么可能呢?

如果觉得我错过了一些非常愚蠢的东西。

$q = mysql_query("SELECT STOCK_TRADE_NAME,STOCK_ID FROM current_stocks WHERE STOCK_COUNTRY_ID = 7 LIMIT 1,9");
while ($row = mysql_fetch_array($q)) {
    $stockid = $row['STOCK_ID'];
    $url = "http://www.some.url.com/?stock_name=" . $row['STOCK_TRADE_NAME'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    $dom = new simple_html_dom;
    $dom->load($output);
    foreach($dom->find('span.amount') as $e) {
        $price = str_replace(',','',$e->outertext);
    }
    foreach($dom->find('tr.even') as $f) {
        if (strstr($f->outertext,'<td class="name">Open</td>')) {
            $exp = explode('<td class="value">',$f->outertext);
            $open = str_replace('</td>','',$exp[1]);
        }
    }
    echo $stockid . " " . $price . "<br>";
    mysql_query("UPDATE current_stocks SET STOCK_CURRENT_PRICE = $price WHERE STOCK_ID = $stockid") or die(mysql_error());
    $ch="";  
    $dom="";

}

输出

345 11.300
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '11.300 WHERE STOCK_ID = 345' at line 1

注意:STOCK_ID是INT(11),STOCK_CURRENT_PRICE是DECIMAL(8,3)

注意2:我使用的是最新的MySQL / PhpMyAdmin / PHP版本。

更新

将查询编辑为:

$q2 = "UPDATE current_stocks SET STOCK_CURRENT_PRICE = '" . $price . "' WHERE STOCK_ID = '" . $stockid . "'";
mysql_query($q2) or die(mysql_error());

删除错误消息,但不更新数据库。

4 个答案:

答案 0 :(得分:0)

尝试将$price封装在引号中:'$price';

答案 1 :(得分:0)

快速解决方法:在查询中添加''

 mysql_query("UPDATE current_stocks SET STOCK_CURRENT_PRICE = '$price' WHERE STOCK_ID = '$stockid'") or die(mysql_error());

更好:使用参数化查询,以便您的内容和逻辑分离:您不会遇到此问题,并且可以免费注射可能的注射:)

答案 2 :(得分:0)

如果添加引号不会改变任何内容,请检查空格字符 - 甚至可能在$price内。是否有隐藏的标签或返回在html中不可见?

尝试类似$price = preg_replace("/'\s+'", '', $price);(未经测试)的内容。

答案 3 :(得分:-2)

我认为这行代码是问题所在:

mysql_query("UPDATE current_stocks SET STOCK_CURRENT_PRICE = $price WHERE STOCK_ID = $stockid")

你不能在mysql查询中引用php变量,而应该使用sprintf命令创建一个文本字符串,然后将其传递给你的mysql数据库。

所以你的查询应该是:

$query = sprintf("Update current_stocks set stock_current_price = '%s' where stock_id = '%s'", $price, $stockid);

然后创建你的mysql查询引用:

mysql_query($query);

希望有所帮助。