对于看似有效的查询,mysqli prepare因SQL语法错误而失败

时间:2014-09-16 20:22:21

标签: php mysqli

我对这个很难过。

我有一些代码可以生成更新查询,准备,绑定它们然后执行。第一个查询成功运行,但随后第二个查询失败。查询非常简单。我更加困惑,因为mysql日志显示正在准备的查询,我能够在mysql中手动执行它。请考虑以下代码:

$set = null;
                        foreach($editable as $field => $value) {
                                if(!empty($value))
                                $set .= $field."=?,";
                        }
                        $set = substr($set, 0, -1);

                        // generate the update query based on object data, and execute it
                        $stmt = $this->dbh->stmt_init() or die("stmt_init: ".$this->dbh->error);
                        $stmt->prepare("UPDATE ".$this->table_name."
                                                                 SET ".$set."
                                                                 WHERE ".$whereclause) or die("prepare failed: ".$this->dbh->error." (".$stmt->sqlstate.")");
                        if($stmt->error) die($stmt->error);

                        $this->bindParameters($stmt, $editable);

                        $stmt->execute();
                        $stmt->close();



 function bindParameters(&$statement, &$params) {
                echo "<pre>";
                var_dump($statement);
                echo "</pre>";
                $args   = array();
                // just assume every value is string type
                $args[] = implode('', array_map(function($v) {
                                                                                                return "d";
                                                                                },
                                                                                array_values($params)));

                foreach ($params as $paramName => $value) {
                        $args[] = &$params[$paramName];
                        //$params[$paramName] = null;
                }

                var_dump($args);
                //die();

                call_user_func_array(array(&$statement, 'bind_param'), $args);
        }

第一部分在循环中运行,其中$ editable是字段名称和值的数组。 $ whereClause总是“client_id = 83”。 $ this-&gt; dbh保存连接对象。此代码适用于第一次更新,但不适用于第二次更新。它正在生成这样的查询:

UPDATE client_rate SET rate=? WHERE client_id=83

它创造了以下内容:

UPDATE client_rate SET rate=99 WHERE client_id=83
UPDATE client_rate SET rate=165 WHERE client_id=83

第二个是因语法错误而失败的那个。 mysql日志显示这些查询,我可以手动运行它们而没有错误。

错误显示的错误是:

prepare failed: 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 'WHERE client_id=83' at line 3 (42000)

这是我在与此相关的mysql查询日志中看到的:

            19954 Query     SELECT * FROM client_rate LIMIT 0
            19954 Query     SELECT * FROM client_rate WHERE client_id=83
            19954 Prepare   UPDATE client_rate
                                                             SET rate=?
                                                             WHERE client_id=83
            19954 Execute   UPDATE client_rate
                                                             SET rate=99
                                                             WHERE client_id=83
            19954 Close stmt
            19954 Query     SELECT * FROM client_rate WHERE client_id=83
            19954 Prepare   UPDATE client_rate
                                                             SET rate=?
                                                             WHERE client_id=83
            19954 Execute   UPDATE client_rate
                                                             SET rate=165
                                                             WHERE client_id=83
            19954 Close stmt

我该怎么做错了会导致准备检测错误?

更新: 当我删除所有错误检查时,我可以看到数据库实际上正在运行查询。我只是在我的页面上得到以下几次:

Warning: mysqli_stmt::bind_param(): invalid object or resource mysqli_stmt

任何明显的事情可能都是我遗失的?

1 个答案:

答案 0 :(得分:0)

好吧,到底我老实说不知道是什么造成的。我注意到我的调试代码真的堆积起来试图解决这个问题,所以我还原了我的工作副本。然后神秘地开始工作。

我不确定我做了什么来打破它,但现在它有效......