Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.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对PDO中的非对象调用成员函数prepare()_Php_Sql_Oracle_Pdo_Prepare - Fatal编程技术网

使用PHP对PDO中的非对象调用成员函数prepare()

使用PHP对PDO中的非对象调用成员函数prepare(),php,sql,oracle,pdo,prepare,Php,Sql,Oracle,Pdo,Prepare,我正在使用PHP与Oracle 11g数据库通信。此代码用于用户上载.xls或.csv文件。如果为.xls,则转换为.csv。如果是.csv,请继续。之后,它获取csv并更新oracle数据库。在过去,我使用sql注入时没有意识到与之相关的安全缺陷。所以,我开始学习使用PDO。然而,我是新来的。我设计的代码(如下)出现以下错误: Fatal error: Call to a member function prepare() on a non-object in /opt/apache/serv

我正在使用PHP与Oracle 11g数据库通信。此代码用于用户上载.xls或.csv文件。如果为.xls,则转换为.csv。如果是.csv,请继续。之后,它获取csv并更新oracle数据库。在过去,我使用sql注入时没有意识到与之相关的安全缺陷。所以,我开始学习使用PDO。然而,我是新来的。我设计的代码(如下)出现以下错误:

Fatal error: Call to a member function prepare() on a non-object in /opt/apache/servers/planninganddesign/htdocs/JointUse/update_handler.php on line 89 
第89行标记如下

代码:




是什么导致了这个问题,有没有简单的解决方法?蒂亚

oci扩展没有面向对象的用法
oci_connect()
返回资源,而不是对象。资源没有方法

@h2oooo的评论是正确的。您似乎在混合使用oci和PDO。选择一个或另一个,最好是PDO

换句话说,不要调用
oci\u connect()
,而是执行以下操作:

$dsn = 'oci:dbname=host:1533/name';
$user = 'user';
$password = 'pass';

try {
    $conn = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
如果成功,您应该能够使用
$conn
作为PDO对象

但是代码中还有一些其他错误

$sql->bindValue(':RECEIVED',$RECEIVED);
如果使用
bindValue()
,则它是语句对象的方法,而不是
$sql
字符串。字符串没有方法。改为这样做:

$stmt->bindValue(':RECEIVED',$RECEIVED);
bindValue()
的所有其他调用也是如此

您还有一行多余的代码,在代码末尾似乎什么也不做:

$exec = execute();
除非您的应用程序中有一个函数
execute()
,否则我不知道这应该做什么

另一个错误是:您的
while
循环测试当前索引
$ArrayNumber
是否有条目,然后在获取值之前递增
$ArrayNumber
。您一定会导致错误,因为您的代码将尝试读取超过数组末尾的内容。读取该数组元素中的数据后,应增加
$ArrayNumber

或者使用
for
循环,而不是
while

$count = count($csv_array);
for ($ArrayNumber = 0; $ArrayNumber < $count; ++$ArrayNumber) {
  ...
关于使用准备好的语句的一些提示。如果只将数组传递给
PDOStatement::execute()
,则可以跳过所有繁琐的
bindValue()
调用。而且您的数据已经存在于一个数组中!您甚至不需要创建所有这些局部变量

由于数据是用整数而不是列名编制索引的,因此应使用序数参数(以
作为占位符)而不是命名参数

此外,不需要为循环的每次迭代准备语句。prepared语句的一个最大优点是,您可以准备一次,然后在循环期间使用不同的值重新使用它

下面是一个例子:

$sql = 'INSERT INTO INTOXDM.JOINT_USE (RECEIVED, REGION, PERMIT, CUSTOMER, TO_BUSINESS, TO_PERMIT, POWER_ADDRESS, COMPANY, MAPSECTION, POLES, FEE, INVOICE, DATE_LARRY, DAYS_LARRY, PI_PON, DATE_PD, DAYS_LARRY_PD, RETURNED, DAYS_PD, ERRORS_PD, ERRORS_MULTIPLE, DATE_MAKEREADY_JU, DATE_MAKEREADY_COMPLETE, DAYS_MAKEREADY, DAYS_JU_PROCES, APPROVAL, DAYS_PERMIT_IN_JU, DATE_PLANNING, DAYS_OPEN, DATE_ROUTED, DAYS_TOTAL, COMMENTS)
     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$stmt = $conn->prepare($sql);

foreach ($csv_array as $row) {
  $stmt->execute($row);
}
最后一个提示:在读取数据后执行此操作:

echo 'Your .csv file was uploaded successfully. Have a nice day.';

但我会在数据成功导入数据库后输出该消息。如果在插入数据库时出现任何问题,则肯定消息可能不是真的。

可能重复的。您不能将
oci
函数与
PDO
函数混合使用。使用100%oci或100%PDO(通过使用)。在我看来,调用
oci\u connect
失败,
$conn
未指向有效连接。祝你好运。@BobJarvis谢谢你的帮助,但是连接肯定成功了。我有其他页面使用完全相同的conn字符串从数据库中提取数据。首先,感谢您提供的详细答案,它教会了我很多。我很感激!更新连接字符串时,我得到以下信息:
连接失败:找不到驱动程序
。以前的错误也出现了,但是我想这可能是由于上面发布的错误。这是否意味着我需要安装PDO?我该怎么做?您的PHP实例似乎没有安装OCI驱动程序。有关该问题的答案,请参阅。
$sql = 'INSERT INTO INTOXDM.JOINT_USE (RECEIVED, REGION, PERMIT, CUSTOMER, TO_BUSINESS, TO_PERMIT, POWER_ADDRESS, COMPANY, MAPSECTION, POLES, FEE, INVOICE, DATE_LARRY, DAYS_LARRY, PI_PON, DATE_PD, DAYS_LARRY_PD, RETURNED, DAYS_PD, ERRORS_PD, ERRORS_MULTIPLE, DATE_MAKEREADY_JU, DATE_MAKEREADY_COMPLETE, DAYS_MAKEREADY, DAYS_JU_PROCES, APPROVAL, DAYS_PERMIT_IN_JU, DATE_PLANNING, DAYS_OPEN, DATE_ROUTED, DAYS_TOTAL, COMMENTS)
     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$stmt = $conn->prepare($sql);

foreach ($csv_array as $row) {
  $stmt->execute($row);
}
echo 'Your .csv file was uploaded successfully. Have a nice day.';