2009-08-02 5 views
15

내가 열 이름 및 값의 결합 배열에 기초하여 준비된 INSERT 명령문을 생성하는 기능은 그 열 및 테이블 이름 (단순한 문자열)에 삽입 될 수있다 :Mysqli Prepare Statement - False로 되 돌리는 이유는 무엇입니까?

function insert ($param, $table) { 
     $sqlString = "INSERT INTO $table (".implode(', ',array_keys($param)).') VALUES ('.str_repeat('?, ', (count($param) - 1)).'?)'; 
     if ($statement = $this->conn->prepare($sqlString)): 
      $parameters = array_merge(array($this->bindParams($param), $param)); 
      call_user_func_array(array($statement, 'bind_param', $parameters)); 
      if (!$statement->execute()): 
       die('Error! '.$statement->error()); 
      endif; 
      $statement->close(); 
      return true; 
     else: 
      die("Could Not Run Statement"); 
     endif; 
    } 

내 문제는 $이며 this-> conn-> prepare (클래스의 일부이고, conn는 아무 문제없이 작동하는 새로운 mysqli 객체이다.)는 false를 반환하지만 나에게 이유를주지 않는다!

INSERT INTO students (PhoneNumber, FirstName, MiddleInit, LastName, Email, Password, SignupType, Active, SignupDate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) 

사람이 매개 변수가 문에 문제가 있음을 볼 수 있습니다 여기에

는 준비 문 내장됩니다 샘플 $의 sqlString입니까? 준비 함수가 false를 반환하는 이유는 무엇입니까?

+2

오류 메시지가 표시됩니다 (준비가 잘못된 경우 http://php.net/manual/en/mysqli.error.php 참조). 그렇다면 무엇입니까? –

+2

올바른 SQL을 가지고 있는지 확인하기 위해 데이터베이스에서 실제 INSERT 문을 실행 해 보았습니까? – DOK

+1

나는 mysqli_report (MYSQLI_REPORT_ALL)를 켜서 무슨 일이 일어나고 있는지 더 잘 이해할 수 있었다. 필드 이름 중 하나가 틀렸다는 것을 알게되었다. prepare()는 예외를 던질 것이라고 생각하지만 조용히 실패한다. –

답변

41

해결 방법을이 답변에 복사하면 답변을 얻을 수 있습니다. 그렇지 않으면 질문이 "답이없는 질문"에 영원히 나타날 것입니다. 이 답변을 CW로 표시하면 어떤 점수도 얻지 못할 것입니다.

앤드류 E. 말한다 :

난 그냥 가 무슨 일이 있었는지의 더 나은 이해를 얻을 수 에 mysqli_report(MYSQLI_REPORT_ALL) 켜져 - 내 필드 이름 중 하나가 잘못된 것을 밝혀 - 당신 'd 은 prepare()이 예외를 던질 것이라고 생각하지만 자동으로 실패합니다.

+0

@ P5Coder, PHP 및 MySQL은 시도한 다른 모든 솔루션을 제외하고는 최악의 솔루션입니다. :-) –

+0

@BillKarwin 다른 고급 언어 나 데이터베이스를 사용 해본 적이 없어야합니다. PHP는 틀림없이 최악의 설계 언어이며 MySQL은 기본 엔진을 사용하여 ACID를 준수하지 않습니다. –

+1

@vee_ess, 기본 엔진은 2010 년에 출시 된 MySQL 5.5 이후의 InnoDB입니다. InnoDB는 대부분의 다른 데이터베이스와 마찬가지로 ACID를 지원합니다. –

관련 문제