2009-08-02 26 views
15

Tôi đã một chức năng mà tạo ra một tuyên bố INSERT chuẩn bị dựa trên một mảng kết hợp các tên cột và các giá trị được chèn vào cột và một tên bảng (một chuỗi đơn giản):Tuyên bố chuẩn bị Mysqli - Trả về False, nhưng tại sao?

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; 
    } 

Vấn đề của tôi là $ mà này-> conn-> chuẩn bị (nó là một phần của một lớp học, conn là một đối tượng mysqli MỚI, mà làm việc với không có vấn đề) trả về false, nhưng không cho tôi một lý do tại sao!

Đây là một mẫu $ sqlString đó được xây dựng cho chuẩn bị tuyên bố:

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

bất cứ ai có thể thấy một vấn đề với tuyên bố tham số này? Bất kỳ lý do nào mà hàm chuẩn bị sẽ trả về false?

+2

Bạn có nhận được thông báo lỗi không (xem http://php.net/manual/en/mysqli.error.php khi chuẩn bị trả về false?); nếu có, nó là cái gì ? –

+2

Bạn đã thử chạy câu lệnh INSERT thực sự trong cơ sở dữ liệu của mình, để thấy rằng bạn có đúng SQL không? – DOK

+1

Tôi vừa bật mysqli_report (MYSQLI_REPORT_ALL) để hiểu rõ hơn về những gì đang diễn ra - một trong những tên trường của tôi không chính xác - bạn nghĩ rằng chuẩn bị() sẽ ném một ngoại lệ, nhưng nó không thành công. –

Trả lời

41

Tôi đang sao chép giải pháp vào câu trả lời này để điều này có thể được đưa ra một câu trả lời, nếu không câu hỏi sẽ xuất hiện trong "câu hỏi chưa được trả lời" mãi mãi. Tôi đang đánh dấu câu trả lời này CW vì vậy tôi sẽ không nhận được bất kỳ điểm nào.

@ Andrew E. nói:

Tôi chỉ bật mysqli_report(MYSQLI_REPORT_ALL) để có được một sự hiểu biết tốt hơn về những gì đã xảy ra - chỉ ra rằng một trong những tên trường của tôi là không chính xác - bạn 'd nghĩ rằng prepare() sẽ ném một ngoại lệ , nhưng không thành công.

+0

@ P5Coder, PHP và MySQL là những giải pháp tồi tệ nhất, ngoại trừ tất cả các giải pháp khác đã được thử. :-) –

+0

@BillKarwin Bạn không bao giờ phải thử các ngôn ngữ hoặc cơ sở dữ liệu cấp cao khác. PHP được cho là ngôn ngữ được thiết kế tồi tệ nhất từ ​​trước đến nay và MySQL không tuân thủ ACID bằng cách sử dụng công cụ mặc định của nó. –

+1

@vee_ess, công cụ mặc định là InnoDB từ MySQL 5.5, được phát hành vào năm 2010. InnoDB hỗ trợ ACID cũng như hầu hết các cơ sở dữ liệu khác. –

Các vấn đề liên quan