添加 :start 作为要跳过的参数时出现以下错误。我知道如果我对 SKIP/NEXT 值进行硬编码并且 :customerID 保持不变,则 SQL 查询会起作用。如果我删除 :start 子句并将其保留为 SKIP 1 FIRST 5 ... WHERE t1.customer_num = :customerID ... 它工作得很好。我找不到错误发生的原因。
错误
exception 'PDOException' with message 'SQLSTATE[HY004]: Invalid SQL data type: -11064 [Informix][Informix ODBC Driver]SQL data type out of range
我尝试过的东西:
$sql->bindValue(':start', (int) 1, PDO:PARAM_INT); — 不行。有什么建议吗?我正在使用 PHP 5.3。(最近的东西)和使用 PDO 连接器的 Informix 11。同样,它仅与 customerID 一起使用,但不适用于 :start 并返回上述错误。
$sql = null;
$sql= $conn->prepare('SELECT SKIP :start FIRST 5 TRIM(loc_esi_id) FROM customer t1,customer_ts_data t2 WHERE t1.customer_num = :customerID AND t1.customer_num = t2.customer_num');
//Bind values to parameters(by value)
$sql->bindValue(':start', $start ,PDO::PARAM_INT);
$sql->bindValue(':customerID', $customerID, PDO::PARAM_INT);
//$sql->bindParam(':count',$count,PDO::PARAM_INT);
$results = null;
try{
$sql->execute();
$results = $sql->fetchAll();
} catch (PDOException $e) {
//Error Handling, etc.
最佳答案
通常,占位符的 :start 表示法既不是标准 SQL 语法也不是(本地)Informix 语法。您需要使用 ? 作为占位符,因此:
$sql= $conn->prepare('SELECT SKIP ? FIRST 5 TRIM(loc_esi_id)
FROM customer t1
JOIN customer_ts_data t2 ON t1.customer_num = t2.customer_num
WHERE t1.customer_num = ? AND ');
(如果所有这些都需要在 PHP 中放在一行中,我为为了提高可读性而牺牲准确性而道歉)。
现在,PDO 系统有可能自动将 :start 符号转换为 ?,在这种情况下我们会遇到不同的问题。但是除非你确定 :name 符号有效,否则......
不确定的原因之一是 bindValue() 调用似乎需要名称,而不是 ? 可能需要的数字。您的代码错误是否检查了 bindValue() 调用?
此 ESQL/C 代码有效,产生了我期望的输出。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
$ char *dbase = "stores";
$ int num_skip = 3;
$ int num_fetch = 5;
if (argc > 2)
{
fprintf(stderr, "Usage: %s [dbase]\n", argv[0]);
exit(1);
}
if (argc == 2)
dbase = argv[1];
exec sql whenever error stop;
exec sql connect to :dbase;
exec sql prepare p from "select skip ? first ? tabid, tabname from informix.systables";
exec sql declare c cursor for p;
exec sql open c using :num_skip, :num_fetch;
while (sqlca.sqlcode == 0)
{
$ int4 tabid;
$ varchar tabname[129];
exec sql fetch c into :tabid, :tabname;
if (sqlca.sqlcode != 0)
break;
printf("%d: %s\n", tabid, tabname);
}
exec sql close c;
exec sql free c;
exec sql free p;
exec sql disconnect all;
return 0;
}
4: systabauth
5: syscolauth
6: sysviews
7: sysusers
8: sysdepend
这表明如果正确使用占位符符号,则可以使用 SKIP 和 FIRST 参数。
如果您找不到使它与 PDO 一起工作的方法,您可能遇到了错误。如果您可以在将环境变量 SQLIDEBUG=2:/tmp/your_sub_dir/check 设置为某个类似值的情况下运行您的代码,那么您应该找到发送到服务器的内容的记录(除了连接设置)在名称为 /tmp/your_sub_dir/check_21484_0_aedc1e0 的文件中。数字模式有点可变。然后您可以在该文件上运行 sqliprint 程序并查看 PDO 发送到服务器的内容。这将是确定 PDO 或 Informix 中是否存在错误的一种非常快速的方法。
例如,我从 sqliprint 得到的部分输出是:
C->S (20) Time: 2012-05-29 17:55:08.65225
SQ_CONNECT
"stores" [6]
"stores" [6]
C->S (72) Time: 2012-05-29 17:55:08.65239
SQ_PREPARE
# values: 2
CMD.....: "select skip ? first ? tabid, tabname from informix.systables" [60]
SQ_NDESCRIBE
SQ_WANTDONE
SQ_EOT
可以很清楚的看到发送的SQL语句。如果你没有看到 ? 占位符,那么上游有问题; Informix 的 PDO 驱动程序没有正确地完成它的工作,或者它被滥用了。如果您看到 ? 占位符,我们将遇到一组不同的问题,但我认为如果这就是问题所在,我会感到惊讶。
SQLIDEBUG 机制中唯一需要注意的是,无论哪个进程连接到数据库,您都需要在环境中设置环境变量。对于独立的 ESQL/C 程序,这是微不足道的。如果您要通过网络服务器和 PHP,那可能会更棘手 — 但这是可以做到的。
关于php - Informix 的变量绑定(bind)返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10803475/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file