2013-12-04 3 views
0

Так что я спагетти PHP приложением, которое я уверен, преобразование в использование класса базы данных ООП/MVC макетаПолучить автогенерируемую идентификатор из Oracle после вставки с использованием класса PHP DB

Раньше на форме, было SQL заявлением запущенным на должность, которая принесла бы вставленный ID в переменную связывания (на основе SO Get the auto-generated ID after an insert

$sql ="insert into table (name, type) values (:name, :type) returning id into :id"; 
$squery = oci_parse($link, $sql); 
    oci_bind_by_name($squery,":name", $_POST['name']); 
    oci_bind_by_name($squery,":type", $_POST['type']); 
    oci_bind_by_name($squery,":id", $id,-1, SQLT_INT); 
oci_execute($squery); 

в этой точке, $ идентификатор может быть использован в качестве переменной был присвоен вставленный идентификатор

Итак, моя проблема, моя модель передает значения за м $ _POST к классу базы данных, но никогда не присваивает переменной

Model

function create(){ 

$sql ="insert into table (name, type) values (:name, :type) returning id into :id"; 
$this->db->execute($sql, "table insert", 
array(
    array(":name", $_POST['name'], -1, SQLT_CHR), 
    array(":type", $_POST['type'], -1, SQLT_CHR), 
    array(":id", $id,-1, SQLT_INT) 
     ) 
    ); 
return $id; 
} 

базы данных класса (на основе http://docs.oracle.com/cd/E17781_01/appdev.112/e18555/ch_three_db_access_class.htm)

public function execute($sql, $action, $bindvars = array()) { 
    $this->stid = oci_parse($this->conn, $sql); 
    if ($this->prefetch >= 0) { 
     oci_set_prefetch($this->stid, $this->prefetch); 
    } 
    foreach ($bindvars as $bv) { 
     // oci_bind_by_name(resource, bv_name, php_variable, length , type) 
     oci_bind_by_name($this->stid, $bv[0], $bv[1], $bv[2], $bv[3]); 
    } 
    oci_set_action($this->conn, $action); 
    oci_execute($this->stid);    // will auto commit 

} 

Класс является правильным, то есть он будет выполнять отлично , он просто не вернет последний вставленный идентификатор.

ответ

0

это то, что я придумал (конечно Theres лучший ответ)

вопрос был, когда я перешел в переменной для возвращения в затруднительное, он не передавая переменную как переменную ($ ID) это был передать его в качестве значения переменной, и он hadnt был назначен таким образом это было пустым

так в моем классе базы данных я создал

public function executeAndReturnID($sql, $action, $bindvars = array(), $return) { 
    $this->stid = oci_parse($this->conn, $sql); 
    if ($this->prefetch >= 0) { 
     oci_set_prefetch($this->stid, $this->prefetch); 
    } 
    foreach ($bindvars as $bv) { 

     oci_bind_by_name($this->stid, $bv[0], $bv[1], $bv[2], $bv[3]); 
    } 
    // THIS PART TAKES THE RETURN AND CREATES A BIND AND VARIABLE 
    oci_bind_by_name($this->stid, ':'.$return, $res, -1, SQLT_INT); 

    oci_execute($this->stid);    // will auto commit 
    $this->stid = null; // free the statement resource 
    return($res); 

    } 

и в моей модели

function create(){ 

$sql ="insert into table (name, type) values (:name, :type) returning id into :id"; 
$id = $this->db->executeAndReturnID($sql, "table insert", 
array(
    array(":name", $_POST['name'], -1, SQLT_CHR), 
    array(":type", $_POST['type'], -1, SQLT_CHR), 

     ), 
    "id" //the bind var for return into 
    ); 
return $id; 
} 
Смежные вопросы