非法变量名称/编号

时间:2014-02-04 00:26:34

标签: php sql oracle10g

我在以下代码中有一个名为database_work_location的字段:

$database_work_location =& new Select_Database_Work_Location();
$database_work_location->setSelected($in['database_work_location']);
$form->addElement('database_work_location', $database_work_location );

然后我使用以下代码在表单上显示它:

<p>
Database Location:<br />
<?= $form->render('database_work_location'); ?>
</p>

到目前为止,我可以选择一个没有任何问题的位置。

最后,我使用以下代码将其发送到数据库:

case 'DATABASE':

$args[] = array('database_work_location', $in['database_work_location']);

$DB->query("
    INSERT INTO request_database
    (
        database_work_location
    )
    VALUES (
        :database_work_location
    )
    "
    ,$args
    );

    break;

但是,当我尝试提交表单时出现以下错误,我不知道为什么。

SQL Error: 1036 - ORA-01036: illegal variable name/number
[query]

INSERT INTO request_database
(
database_work_location
)
VALUES (
:database_work_location
)

[binds] request_cn => [9867520000] length=[] created_by => [someone] length=[] database_work_location => [theplace] length=[] 

所以,如果绑定正确,(它识别选定的位置),为什么它告诉我这是一个非法的变量?

在数据库表中,列database_work_location是一个大小为100的varchar2,老实说,我看不出这个问题。

5 个答案:

答案 0 :(得分:4)

尝试像这样使用PDOStatement:

case 'DATABASE':

$stm = $DB->prepare('INSERT INTO request_database(database_work_location)
VALUES (:database_work_location)');

$stm->bindParam(':database_work_location', $in['database_work_location']);

$stm->execute();

break;

答案 1 :(得分:0)

我已经实现了您的代码,现在它可能运行良好

case 'DATABASE':

$args[] = array('database_work_location', $in['database_work_location']);

$DB->query("
    INSERT INTO request_database
    (
        database_work_location
    )
    VALUES (
        database_work_location
    )
    "
    ,$args
    );

    break;

答案 2 :(得分:0)

试试这个:

case 'DATABASE':

$args = array('database_work_location', $in['database_work_location']);

$DB->query("
    INSERT INTO request_database
    (
        database_work_location
    )
    VALUES (
        database_work_location
    )
    "
    ,$args
    );

    break;
祝你好运。

答案 3 :(得分:0)

如果您不想使用Rida建议的解决方案(这是更好的方法),我认为您的错误是使用了错误的名称,驱动程序无法将列名与数据区分开。

试试这个:

$args[] = array('database_work_location_data', $in['database_work_location']);

$DB->query("
    INSERT INTO request_database
    (
        database_work_location
    )
    VALUES (
        :database_work_location_data
    )
    "
    ,$args
    );

    break;

如果我不清楚,请问我。

答案 4 :(得分:-1)

为什么不呢?

case 'DATABASE':

    $query = 'INSERT INTO request_database(database_work_location)
    VALUES ('. $in['database_work_location'] .')';

    $stm = $DB->prepare($query);

    $stm->execute();

    break;