2014-04-12 3 views
0

나는 다음과 같은 열이 테이블 content에 데이터베이스에 페이지의 콘텐츠의 조각을 삽입 할 MySqli을 사용하고있는 모든 데이터를 삽입하는 데 실패 콘텐츠의 유형은 TEXT입니다. 그러나 삽입 문을 실행할 때 테이블에 새 항목을 삽입하지만 nameorder 값을 올바르게 삽입하는 동안 contentparent 값을 삽입하지 않는 것이 문제입니다. 모든 준비 함수의 반환 값을 확인하고 모두 true를 반환하거나 아무런 오류도주지 않아서 무슨 일이 일어나고 있는지 혼란 스러워요.삽입이 제대로

클래스 속성 ($this->Content$this->Parent)이 채워져 있고 적절한 데이터가 들어 있습니다. 또한 업데이트/edit 함수의 일부는 잘 작동합니다 (이 두 부분의 준비된 기능이 정확히 동일하므로 이상한 오류 임).

이것은 쿼리를 수행하는 코드입니다. $type 변수는 edit 또는 new의 두 값을 취할 수 있으며 new 값이 올바로 작동하지 않는 경우

public function Save($type) 
{ 
    if($type == "edit") 
    { 
     $query = "UPDATE `content` SET `name` = ?, `content` = ?, `parent` = ? WHERE `id` = ?"; 
     $stmt = $this->sql->prepare($query); 
     $stmt->bind_param("ssii", $this->Name, $this->Content, $this->Parent, $this->ID); 
    } 
    else if ($type == "new") 
    { 
     $query = "INSERT INTO `content`(`name`, `parent`, `content`, `order`) VALUES(?, ?, ?, 999)"; 
     $stmt = $this->sql->prepare($query); 
     $stmt->bind_param("ssi", $this->Name, $this->Content, $this->Parent); 
    }  
    if(!$stmt->Execute()) 
     echo "Failed saving content-object with ID $this->ID" . mysqli_error($this->sql); 
    $stmt->close(); 
} 

은 내가 edit 부분이 완벽하게 잘 작동 왜 아무 생각이 없지만, new 부분은하지 않습니다. 쿼리는 올바른 이름과 순서 값을 가진 새로운 행을 삽입하므로, bind_param 함수와 관련이 있습니다. 데이터베이스의 행은 항상 및 parent에 대해 0 값을 갖습니다.

+0

맨 먼저 : http://stackoverflow.com/a/22662582/285587 –

+0

@YourCommonSense : MysqlI 개체를 만들기 전에 추가되었습니다. 삽입 후에도 오류가 표시되지 않았습니다. –

+0

@JoeyDewd 새 콘텐츠를 삽입 할 때 바인딩 및 값 순서가 잘못되었습니다. –

답변

1

잘못된 방법으로 바인딩했습니다.

값 유형이 sis이어야하며 값 순서가 잘못되었습니다. 아래 업데이트를 참조하십시오.

+0

당신 말이 맞아요, 제가 명령을 어 기고 어리석은 것처럼 보였습니다.나는이 코드를 몇 시간 꼼짝 않고 바라 보았다. 코드를 편집했는데 이제 완벽하게 작동합니다. 고마워요 –

+0

그래, 그걸 시도했지만, 질문을 만든 후 주어진 시간이 지난 후에 만 ​​받아 들일 수 있습니다;) –

-1

내가 무슨 문제인지 모르겠다. if/else 로직을 좋아하지 않는다. 나는 스위치를 직접 사용하는 것을 선호한다.

public function Save($type) 
{ 
    switch($type) { 

     case 'edit': 

     $query = "UPDATE `content` SET `name` = ?, `content` = ?, `parent` = ? WHERE `id` = ?"; 
     $stmt = $this->sql->prepare($query); 
     $stmt->bind_param("ssii", $this->Name, $this->Content, $this->Parent, $this->ID); 

     if(!$stmt->Execute()) { 
      echo "Failed saving content-object with ID $this->ID" . mysqli_error($this->sql); 
        $stmt->close(); 
     }else{ 
        $stmt->close(); 
      } 
     break; 

     case 'new': 

     $query = "INSERT INTO `content`(`name`, `parent`, `content`, `order`) VALUES(?, ?, ?, 999)"; 
     $stmt = $this->sql->prepare($query); 
     $stmt->bind_param("ssi", $this->Name, $this->Content, $this->Parent); 

     if(!$stmt->Execute()) { 
      echo "Failed saving content-object with ID $this->ID" . mysqli_error($this->sql); 
        $stmt->close(); 
     }else{ 
        $stmt->close(); 
      } 
     break; 

     default: die; 

    } 
} 

또 다른 사실 : 데이터베이스에 연결하고 매우 정통적인 방식으로 쿼리를 실행합니다. 모든 페이지에서 필요한 설정 파일에 db 연결을 만들고 전역으로 캐스팅 한 다음 global $database과 같이 함수 내부의 전역 배열을 통해 액세스하십시오. 당신은 당신이 echo "welcome to my website, $username";

처럼, 그들 변수를 떠나려고하지 않는 한 당신은 PHP에서 따옴표를 사용하면 PHP에서 따옴표를 사용하지 않는, 더 쉽게 $stmt = $database->prepare("INSERT INTO ....");

다른 것은 같은 물건을 수행 할 수 있습니다 , PHP는 그 안의 변수를 찾고 있으므로 가능한 한 작은 따옴표를 사용하여 스크립트의 성능을 높이고 서버 리소스를 절약하십시오.

+0

그의 논리에 문제가 있습니까? –

+0

@ r3wt : 팁 주셔서 감사합니다. (큰 따옴표 팁이 좋습니다.) 예, 데이터베이스는 실제로 클래스 객체에 전달되는 전역 객체이지만 두 번째 단계는 실제로 필요하지 않으므로 올바른 것입니다. 또한 논리가 정확하고 잘못된 점이 없습니다. –

+0

그것은 미신의 환상적인 컬렉션입니다. @JoeyDewd 이러한 팁 중 어느 것도 맞지 않습니다. –