所有 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 是文本类型。我已经在另一个地方使用 PDO,那里我只有各种 VARCHAR 列,并且在那里它可以正常工作。
有没有人遇到过类似的问题?有人可以帮我解决这个问题吗?
经过一些挖掘和阅读 ( http://www.php.net/manual/en/pdo.lobs.php ) 我切换到一个不同的解决方案。我现在绑定(bind)输入参数和输出列。不过,我会保留最初的文字,所以犯同样最初错误的人可能会比我更容易发现。
绑定(bind)参数很容易。我将输出列绑定(bind)在一个通用函数中:
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 行 $statement 说它已经检索到一行,但执行永远不会到达 while 循环内部(第 14 - 17 行),因为 $statement-fetch() 总是返回 false,不不管我使用哪个 PDO::FETCH_ 常量(我尝试了 PDO::FETCH_OBJ、PDO::FETCH_BOUND 和 PDO::FETCH_ASSOC,其他的似乎对 LOB 没有多大意义,而且手册页只说明了 PDO: :LOB 的 FETCH_BOUND)。
上面提到的手册页的注释中记录了一个错误,它说简单地从行中读取 LOB 应该是安全和可以的。尽管如此,我什至在访问行数据之前就出现了问题,尽管我似乎已经完全按照示例代码完成了所有操作。
不过,现在有一项改进。 mySQL 跟踪显示了我正在执行的 SQL。此外,由于第 04 行说的是我期望的行,我想我已经接近解决方案了 - 但我似乎无法确定它。
最佳答案
你有多个问题:
确保 $parameters 是这样的数组:
array('ssdUserID' => "val", 'json' => "{}");
此外,在使用准备好的语句时,您不需要调用 addslashes。 PDO 会为您做到这一点。
要查找错误,您可以添加以下内容(在您的 $statement->execute() 调用之后):
var_dump($connection->errorInfo());
PS:new PDO(... 行中的分号过多。
关于PHP PDO 在每次写操作时都失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059300/
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id