所有SELECT都正常工作。但是,任何UPDATE或INSERT,即使在mysql查询浏览器中执行它时工作,同时使用与PHP相同的用户登录连接到服务器,也会在PDO执行时失败。
举个例子:
SELECT * FROM Projects WHERE ssdUserID = :ssdUserID;
始终正常工作,而
INSERT INTO Projects SET ssdUserID = :ssdUserID, json = :json;
从PHP执行时,始终失败,尽管我对所有参数都执行了addslashes()。
我称之为PDO的方式是通过准备好的声明:
$connection = new PDO("mysql:host=$mysqlServer;
dbname=$mysqlSchema", $mysqlUser, $mysqlPassword);;
$statement = $connection->prepare($sql);
$result = $statement->execute($parameters);
$ result始终为false,尽管最后会发生提交(目前为了调试目的),但数据库中没有更新或插入。
我启用了mysql跟踪日志,似乎sql甚至没有被发送到mysql服务器 - 所有在跟踪日志中都可以看到事务的开始和结束,两者之间没有任何内容。
由于搜索工作,很明显PDO能够与数据库建立连接。此外,由于搜索使用与不适用于写语句的代码相同的代码,因此我无法想到任何其他地方出现问题而不是PDO本身。
可能很重要的一个问题是上面示例中的列json是text类型。我已经在另一个地方使用PDO,我只有各种VARCHAR cols,并且它可以正常工作。
是否曾经有过类似的问题?有人可以帮我吗?
经过一些挖掘和阅读(http://www.php.net/manual/en/pdo.lobs.php)后,我改用了另一种解决方案。我现在绑定了inpput参数和输出列。但是,我会留下初始文本,所以ppl做同样的初始错误可能比我更容易找到。
绑定参数很容易。我将输出列绑定在通用函数中:
01 private function __extractResultsEx($statement, $columns)
02 {
03 $data = array();
04 $msg = "query returned ".$statement->rowCount()." rows";
05 $receiverRow = array();
06 $i = 1;
07 foreach ($columns as $column => $type)
08 {
09 $receiverRow[$column] = NULL;
10 $statement->bindColumn($i++, &$receiverRow[$column], $type);
11 }
12 while ($statement->fetch(PDO::FETCH_BOUND))
13 {
14 $row = array();
15 foreach ($columns as $column => $type)
16 $row[$column] = $receiverRow[$column];
17 $data[] = $row;
18 }
19 return $data;
20 }
列是ID / PDO :: PARAM_INT,userID / PDO :: PARAM_INT和json / PDO :: PARAM_LOB。
我不知道是否需要第09行,只是在最初的尝试之后,$ receiverRow最终确实有三个元素,但没有一个被初始化,我认为这可能会有所帮助 - 但事实并非如此。
使用这种方法,问题是虽然在第04行$语句中它已经检索到一行,但执行永远不会到达while循环内部(第14-17行),因为$ statement-fetch()总是返回false,no我使用哪个PDO :: FETCH_常量(我尝试过PDO :: FETCH_OBJ,PDO :: FETCH_BOUND和PDO :: FETCH_ASSOC,另一个似乎对LOB没有多大意义,无论如何,手册页只说了PDO: :FETCH_BOUND for LOBs。)
在上面提到的手册页的注释中记录了一个错误,该错误表明只需读取行中的LOB即可。尽管如此,我的问题发生在我甚至可以访问行数据之前,尽管我似乎完全按照示例代码完成了所有操作。
然而,现在有一个改进。 mySQL跟踪显示我正在执行的SQL。此外,由于第04行说的是我期望的行,我想我接近解决方案 - 但我似乎无法指出它。
答案 0 :(得分:2)
您有多个问题:
确保$parameters
是这样的数组:
array('ssdUserID' => "val", 'json' => "{}");
此外,使用预准备语句时无需调用addslashes
。 PDO为您做到了这一点。
要查找错误,您可以添加此错误(在$statement->execute()
通话后):
var_dump($connection->errorInfo());
PS:new PDO(...
行上有1个太多的分号。
答案 1 :(得分:0)
您可以尝试拨打bindParam
而不是将参数传递给execute
吗?
您可能需要为text
类型的列指定长度。
$statement->bindParam(':ssdUserID',$user_id, PDO::PARAM_INT);
$statement->bindParam(':json',$json_str, PDO::PARAM_STR,strlen($json_str) );
$result = $statement->execute();