2017-02-02 6 views
1

У меня есть файл PHP, который будет извлекать данные из RSS-канала и вставлять его в базу данных. Обычно я обертываю каждое поле с помощью специальной функции для замены кавычек, но больше не нуждается в ней (из-за изменения требований). По какой-то причине, когда я использую логику ниже я получаю сообщение об ошибке «функцию oci_bind_by_name ошибки(): Invalid переменных используются для привязки», но если я обернуть каждое поле в пользовательской функции, как это:Ошибка PHP oci_bind_by_name(): Недопустимая переменная, используемая для привязки

$guid = customfunction($item->guid); 

это работает, почему?

Спасибо

foreach($rss->channel->item as $item) { 




    print '<a href="'.$item->link.'">'.$item->title.'</a><br />'; 

    $guid = $item->guid; 
    $title = $item->title; 
    $link = $item->link; 
    $pubDate = $item->pubDate; 
    $description = $item->description; 
    $content = $item->content; 

    $stid = oci_parse($spConn,"INSERT INTO table123 
       (sku, title, link, pubDate, field1, field2) 
       VALUES(:guid_bv, :title_bv, :link_bv, :pubDate_bv, :description_bv, :content_bv)"); 


       oci_bind_by_name($stid, ":guid_bv", $guid); 
       oci_bind_by_name($stid, ":title_bv", $title); 
       oci_bind_by_name($stid, ":link_bv", $link); 
       oci_bind_by_name($stid, ":pubDate_bv", $pubDate); 
       oci_bind_by_name($stid, ":description_bv", $description); 
       oci_bind_by_name($stid, ":content_bv", $content); 

       oci_execute($stid); 
+0

- любое из этих значений null? – Dimi

+0

Прочтите http://www.php.net/manual/en/function.oci-bind-by-name.php пример 3 –

+0

@Dimi ни один из них не является нулевым. – AAA

ответ

0

По умолчанию функция oci_bind_by_name() требует только 3 параметров и обрабатывают все переменные, которые вы связывающиеся как символы. В большинстве случаев это работает отлично, но если вы пытаетесь добавить float, двоичные данные или целые числа, они могут кричать на вас и жалуются на неверную используемую переменную. Чтобы исправить это либо вам нужно либо дать функцией oci_bind_by_name другой набор параметров, например:

if(is_numeric($v2)){ 
    oci_bind_by_name($stmth, $bvar, $v2, 8, OCI_B_INT); 
    }else{ 
    $v2 = (string) $v2; 
    oci_bind_by_name($stmth, $bvar, $v2, -1, SQLT_CHR); 
    } 

или просто обернуть переменную в strval(), как этот

oci_bind_by_name($stid, ":description_bv", strval($description)); 
oci_bind_by_name($stid, ":content_bv", strval($content)); 

В то время как я настоятельно советую создавать/с помощью пользовательский класс, который будет обрабатывать все привязки переменных для вас, используя strval() с вашими переменными, следует устранить все ошибки «Недопустимая переменная, используемая для привязки» при передаче целых чисел, удвоений или других форматов.