【问题标题】:Problem with inserting data in Oracle database using PHP [closed]使用 PHP 在 Oracle 数据库中插入数据的问题[关闭]
【发布时间】:2010-01-26 16:12:13
【问题描述】:

以下错误:

"警告:oci_execute() [function.oci 执行]:ORA-00911: 中的无效字符 F:\wamp\www\搜索引擎\test1.php 在第 69 行"

正在由此代码生成:

<?php
include_once('config.php');
$db = oci_new_connect(ORAUSER,ORAPASS,"localhost/XE");

$url_name = $_POST['textfield'];
$keyword_name = $_POST['textarea'];
$url_type = $_POST['RadioGroup1'];
$anchor_text = $_POST['textfield2'];
$description = $_POST['textarea2'];   

$sql = "select seq_url1.nextval seq_url1 from dual"; 
$result = oci_parse($db,$sql);

oci_execute($result);   
if($result) 
{
    while($row = oci_fetch_array($result))
    {   
        $temp = $row['SEQ_URL1'];
        echo $temp;
    }
}           

$sql_url1 = 'INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription) '.'VALUES($temp,:url,:type,:anchor,:description)';

$compiled = oci_parse($db, $sql_url1);

oci_bind_by_name($compiled, ':url', $url_name);
oci_bind_by_name($compiled, ':type', $url_Type);
oci_bind_by_name($compiled, ':anchor', $anchor_text);
oci_bind_by_name($compiled, ':description', $description);

oci_execute($compiled);
?>

这可能是什么原因造成的?

【问题讨论】:

  • 好吧,你能告诉我们无效字符以及查询被发送到数据库时的样子吗?
  • 我不是 Oracle Guru,但是为什么在定义 $sql_url1 的字段和 VALUES 语句之间有一个句点?
  • @George - 在这种情况下,那个句点是 PHP 连接运算符......至于 为什么 它在那里,我也很好奇!

标签: php oracle ora-00911


【解决方案1】:

这可能是由于“描述”的拼写错误造成的:

$sql_url1='INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription)...
                                                                  ^ here

【讨论】:

    【解决方案2】:

    这个:

    $sql_url1 = 'INSERT INTO URL1
                    (Url_ID,Url_Name,url_Type,Anchor_Text,Dscription)'.'
                 VALUES
                    ($temp,:url,:type,:anchor,:description)';
    

    ...应该是:

    $sql_url1 = 'INSERT INTO URL1
                    (Url_ID,Url_Name,url_Type,Anchor_Text,Dscription)'.'
                 VALUES
                    (seq_url1.NEXTVAL,:url,:type,:anchor,:description)';
    

    您不需要两个查询来执行操作,只需在 INSERT 语句中调用 sequence.NEXTVAL。使用现有数据的唯一原因是,如果您将该序列值重新用于其他记录。

    另外,Dscription 可能是一个错字,与实际的列名不匹配。使用DESCRIBE URL1 确认。您可以尝试在运行之前打印查询:

    oci_bind_by_name($compiled, ':url', $url_name);
    oci_bind_by_name($compiled, ':type', $url_Type);
    oci_bind_by_name($compiled, ':anchor', $anchor_text);
    oci_bind_by_name($compiled, ':description', $description);
    
    echo $sql_url1
    

    【讨论】:

      【解决方案3】:

      我有根据的猜测是您的 Web 表单的编码与您的 Oracle 数据库和/或连接的编码不匹配。 mySQL 会优雅地将损坏的字符写入表中——也许 Oracle 更严格。

      但首先要检查一下 George Johnston 或 John Rasch 的观察是否在金钱上是不正确的,并为我们提供一些调试数据以供查看。

      【讨论】:

        【解决方案4】:

        您的查询中有一个使用不当的 PHP 变量。

        $sql_url1 = 'INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription) VALUES($temp,:url,:type,:anchor,:description)';
        

        在这里,$temp 仅用于转储整数,但由于字符串使用单引号,因此不会发生替换,并且 oracle 会看到“$temp”(在该上下文中无效)。切换到双引号:

        $sql_url1 = "INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription) VALUES($temp,:url,:type,:anchor,:description)";
        

        或者采纳上述建议并使用seq_url1.nextval。描述拼写错误,但这会引发未知列错误,而不是无效字符错误。

        谢谢, 乔

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          • 2013-06-05
          • 1970-01-01
          相关资源
          最近更新 更多