Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使Oracle保留查询中出现的标识符的大小写?_Php_Oracle_Pdo_Case Sensitive - Fatal编程技术网

Php 如何使Oracle保留查询中出现的标识符的大小写?

Php 如何使Oracle保留查询中出现的标识符的大小写?,php,oracle,pdo,case-sensitive,Php,Oracle,Pdo,Case Sensitive,我想使用一个使用PDO的php库。我想使用一个Oracle数据库 问题是该库的作者在查询中使用了不带引号的标识符,例如: $statement=$pdo->prepare('SELECT*from some_table,其中some_column=:some_column'); $statement->execute(['some_column'=>'some value']); $result=$statement->fetch(\PDO:fetch\u ASSOC); 返回$result['

我想使用一个使用PDO的php库。我想使用一个Oracle数据库

问题是该库的作者在查询中使用了不带引号的标识符,例如:

$statement=$pdo->prepare('SELECT*from some_table,其中some_column=:some_column');
$statement->execute(['some_column'=>'some value']);
$result=$statement->fetch(\PDO:fetch\u ASSOC);
返回$result['some_other_column'];
在本例中,Oracle将标识符的大小写转换为大写,但作者假定大小写为小写,因此会出现
未定义索引
php错误

我如何绕过这个

UPD。我尝试在创建数据库对象时使用小写,例如:

创建表格“一些表格”
(
“some_column”VARCHAR(10),
“some_other_column”VARCHAR(10)
);
-但是在这种情况下,Oracle在执行上面的
SELECT
语句时会引发一个错误,因为其中的标识符转换为大写,而对象名转换为小写

UPD2


我不应该编辑第三方库的源代码-必须以某种方式配置我的环境和连接:Oracle、PHP、PDO。

如果您想使用小写标识符,那么,正如您在问题中所写的,您需要在Oracle中对它们进行双引号:

创建表格“一些表格”
(
“some_column”VARCHAR(10),
“some_other_column”VARCHAR(10)
);
如果您使用了区分大小写的标识符,则每次使用时都需要引用它们。因此,PHP中的SQL语句应该是:

$statement=$pdo->prepare('SELECT*自“some_table”,其中“some_column”=:some_column');
一旦在那里引用了它们,那么标识符将与数据库中的值匹配,并且返回的结果集也应该具有小写的列标识符

我如何绕过这个

从Oracle的文档中:

数据库对象命名规则 每个数据库对象都有一个名称。在SQL语句中,使用带引号的标识符或不带引号的标识符表示对象的名称

  • 带引号的标识符以双引号(“)开头和结尾。如果使用带引号的标识符命名架构对象,则无论何时引用该对象,都必须使用双引号
  • 不带引号的标识符不被任何标点符号包围
您可以使用带引号或不带引号的标识符来命名任何数据库对象

  • 不带引号的标识符不区分大小写。Oracle将其解释为大写。带引号的标识符区分大小写

  • 这意味着您不能在Oracle中绕过这一点,因为这是Oracle设计的行为方式并且可以有小写标识符,否则Oracle会将不带引号的标识符隐式转换为大写。

    多亏了
    您的常识
    的评论,我找到了一个解决方案

    初始化库时,我向它传递一个PDO对象-我已通过以下代码将其配置为始终使用小写:

    $options=[
    PDO::ATTR_CASE=>PDO::CASE_LOWER,
    ];
    $connection=newpdo($dsn、$username、$password、$options);
    init3rdPartyLibrary($connection);
    

    因此,
    $statement->fetch()返回的
    $result
    变量的键
    现在是小写的,因此该库可以按照作者的预期工作。

    我不懂PHP,但是-就Oracle而言-如果您想保留字母大小写,请将这些标识符括在双引号中。看看是否有帮助。@Littlefoot如果我不是该库的开发人员,我该怎么做?您是否建议覆盖他们的在他们使用SQL查询的每个地方编写代码?嗯,不。正如我所说,我不懂PHP,我不知道它实际上是如何工作的。我希望其他人能够提供帮助。@YourCommonSense,IMO,pdo已经使用了case_natural-这就是为什么它以大写形式返回结果的原因。但你给了我一个好主意-我将尝试强制它使用小写(因为图书馆的作者使用小写)-也许会有帮助