2010-01-18 3 views
4

아래는 다른 쓴 PHP 데이터베이스 클래스 누군가의 일부입니다, 나는 그것의 약 80 %가 코드, 내 질문에 모든 유엔 관련 코드가 제거 된 것 제거하고 단지 양이 그 날이 실제로하지 않고이 클래스를 테스트 할 수 있습니다 남아 실제 데이터베이스를 쳤다.은 어떻게 PHP는 사용할 배열의 키/값을 알고 있나요?

이 클래스를 사용하면 키를 설정하고 다음 MySQL의 UPDATE로 바뀝니다 가치와 배열을 사용하여 SQL 쿼리를 삽입 할 수 있도록 몇 가지 방법이있다. 나는 내 자신의 응용 프로그램에 UPDATE 및 인서트를 위해이 기능을 사용할 수 있도록이 코드를 100 % 사용하는 방법을 알아 내려고 노력하고있다. 난 당신이 그런 짓을 수집하는 것과

Basicly ... 지금은 혼란 스러워요

// assign some key/values to insert into DB 
$db->assign('name', 'dfgd'); 
$db->assign('age', 87); 
$db->assign('sex', 'female'); 
$db->assign('user_id', 4556); 

// Do the insert 
$db->insert('testing2'); 

내가 페이지에 반복과 같은 코드를 실행에 유지할 수 있습니다이며 항상 사용합니다 올바른 키/값 배열 집합입니다. 당신은 내가 할당() 메서드를 4 번 사용 참조하고 내가 같은 페이지에서이 같은 다른 설정을 실행하면 지금이

INSERT INTO test (name, age, sex, user_id) VALUES (jason davis, 26, male, 5345) 

를 생성 삽입() 메소드 ... 호출 할 수 있습니다 위의

// assign some key/values to insert into DB 
$db->assign('name', 'dfgd'); 
$db->assign('age', 87); 
$db->assign('sex', 'female'); 
$db->assign('user_id', 4556); 

// Do the insert 
$db->insert('testing2'); 
그런 다음이 생성

... (는) 4의 2 개 세트를 결합, 그래서 대신에 두 번째 삽입에 8 기록을 삽입하지 않는 방법 그래서

INSERT INTO testing2 (name, age, sex, user_id) VALUES (dfgd, 87, female, 4556) 

, 그것은 completey 4 개 값의 첫 번째 세트를 대체 새로운 세트 이것은 훌륭하고 내가 원하는 것은 무엇이지만 어떻게 진행되고 있는지 이해할 수 없습니까? 또한 어쨌든 개선 될 수 있습니까?

아래는 전체 클래스와 내 데모 코드, 그것은이 데모 mysql을 연결할 필요없이 실행 할 수 있습니다, 그것은 빌드 SQL을 화면에 출력합니다.

또한 아래 코드에서 public function reset()을 사용해야합니까, 아니면 필요하지 않을까요? 당신이 이름 키를 사용하기 때문에


, 그것은 새로운 키와 이전 키를 대체

<?php 
class DB{ 
    public $fields; 

    public function assign($field, $value){ 
     $this->fields[$field] = ($value)==""?("'".$value."'"):$value; 
    } 

    public function assign_str($field, $value){ 
     $this->fields[$field] = "'".addslashes($value)."'"; 
    } 

    public function reset(){ 
     $this->fields = array(); 
    } 

    public function insert($table){ 
     $f = ""; 
     $v = ""; 
     reset($this->fields); 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field; 
      $v.= ($v!=""?", ":"").$value; 
     } 
     $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")"; 
     //print SQL to screen for testing 
     echo $sql; 
     //$this->query($sql); 
     return $this->insert_id(); 
    } 

    public function update($table, $where){ 
     $f = ""; 
     reset($this->fields); 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field." = ".$value; 
     } 
     $sql = "UPDATE ".$table." SET ".$f." ".$where; 
     echo $sql; 
     //$this->query($sql); 
    } 

    public function query($_query){ 
     $this->query = $_query; 
     $this->result = @mysql_query($_query, $this->link_id) or die($_query."<p>".mysql_error($this->link_id)); 
     return $this->result; 
    } 

    public function insert_id(){ 
     return @mysql_insert_id($this->link_id); 
    } 
} 


// start new DB object 
$db = new DB; 

// assign some key/values to insert into DB 
$db->assign('name', 'jason davis'); 
$db->assign('age', 26); 
$db->assign('sex', 'male'); 
$db->assign('user_id', 5345); 

// Do the insert 
$db->insert('test'); 


echo '<hr />'; 

// assign some key/values to insert into DB 
$db->assign('name', 'dfgd'); 
$db->assign('age', 87); 
$db->assign('sex', 'female'); 
$db->assign('user_id', 4556); 

// Do the insert 
$db->insert('testing2'); 


echo '<hr />'; 

// assign some key/values to UPDATE the DB 
$db->assign('name', 'jason davis'); 
$db->assign('age', 26); 
$db->assign('sex', 'male'); 
$db->assign('user_id', 5345); 

// DO the DB UPDATE 
$db->update('blogs', 'WHERE user_id = 23'); 

?> 
+0

너무 많은 사람들이이 질문의 '의미'에 대해 논쟁하기 전에 답을 수락하고 싶을 수도 있습니다. –

+0

대답은 42입니다 !!! xP –

+0

내 담당자가 정확히 7,777입니다. 적어도 그것은 1,111 낮다. –

답변

0

insert()update() (원래) 실행시 빈 배열로 $this->fields 속성을 다시 설정해야하지만 어쨌든 (잘못)이 코드를 삭제 했습니까?

업데이트 이와 코드 : 연관 배열에

public function insert($table){ 
     $f = ""; 
     $v = ""; 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field; 
      $v.= ($v!=""?", ":"").$value; 
     } 
     $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")"; 
     $this->reset(); 
     //print SQL to screen for testing 
     echo $sql; 
     //$this->query($sql); 
     return $this->insert_id(); 
    } 

    public function update($table, $where){ 
     $f = ""; 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field." = ".$value; 
     } 
     $sql = "UPDATE ".$table." SET ".$f." ".$where; 
     $this->reset(); 
     echo $sql; 
     //$this->query($sql); 
    } 
+0

문제는 클래스가 작동하지 않는다는 것이 아니라 명백한 "버그"가있는 경우에도 * 작동합니다. –

0

좋아, 우리는 내 이전 대답은 옳은 결론에 도달했다.

$db->assign('user_id', "1"); 

기본적으로이 수행합니다

$this->fields['user_id] = (1)==""?("'1'"):1; 

을 그리고 다시 그것을 할에 도착했을 때, 그것은

$this->fields['user_id'] = (2)==""?("'2'"):2; 

가 할당을하고, 다음 만 다시 USER_ID를 할당 해보십시오 그것을 대체, 나머지 데이터는 동일하게 유지됩니다.


우리가 쿼리 후 $this->reset() 함수를 호출하는 것,이 문제를 해결하려면.

public function query($_query){ 
     $this->query = $_query; 
     $this->result = @mysql_query($_query, $this->link_id) or die($_query."<p>".mysql_error($this->link_id)); 
     $this->reset(); 
     return $this->result; 
    } 

또는 개별 insert 또는 update 기능에서 그것을 호출 할 수 있습니다

public function insert($table){ 
    // .... stuff 
    $this->query($sql); 
    $this->reset(); 
    return $this->insert_id(); 
} 

다른 가능성은 원래 프로그래머가 충분히 당신에게 자신의 의도를 전달하지 않은 것입니다. 그는 모든 질문 후에 $db->reset() 번으로 전화하기를 기대할 것입니다.

+0

와우, 오늘 뇌사라고 생각합니다. – JasonDavis

+0

-1 : reset - 배열의 내부 포인터를 첫 번째 요소로 설정합니다. $ this-> reset();' –

+0

이 일을하는 public 함수 reset()이 어떤 것인지 알지 못합니다. $ this-> fields = array(); ? – JasonDavis

2

키가 고유; 새 값을 지정하면 이전 값이 지워집니다.

+0

이 마음을 왜곡 한 사람이 이유를 설명해 주시겠습니까? –

+0

당신은 반쯤 잘못되었습니다. 키는 대체되지만 클래스가 작동하는 방식이 아닙니다 (코드와 예제를주의 깊게 살펴보십시오). –

+0

'$ this-> fields [$ field]'에 계속 할당됩니다. 내가 말한 것이 어떻게 설명하지 못했을 까? –

2

아직 다른 데이터베이스 abstaction 라이브러리를 열어 둔 경우 AdoDB을 사용하라고 제안합니다. 여러 데이터베이스에 연결할 수 있으므로 나중에 데이터베이스를 전환하려는 경우 코드가 동일하게 유지됩니다. 그것은 삽입/업데이트 전에 데이터를 위생 처리하는 기능을 내장하고 있습니다. 당신이 ADODB를 사용하면 위의 코드에 대한

,이처럼 쓸 것이다 :

$adodb =& ADONewConnection($dsn); 
$data['name'] = 'dfgd'; 
$data['age'] = 87; 
$data['sex'] = 'female'; 
$data['user_id'] = 4556; 

// Do the insert 
$result = $adodb->AutoExecute($table_name, $data, 'INSERT'); 

//If update, must have one of the key, such as id column 
$result = $adodb->AutoExecute($table_name, $data, 'UPDATE', "id=$id"); 

당신은 사이트에서 문서를 읽을 수있는, 또는 zip 파일 안에 당신이 다운로드 할 수 있습니다. 난 항상 내 모든 프로젝트에서이 라이브러리를 사용한다. 심지어 CodeIgniter 데이터베이스 라이브러리에서 빌드하는 것이 더 좋다.

+0

감사합니다. – JasonDavis