> 백엔드 개발 > PHP 튜토리얼 > TP报바운드 변수 수가 토큰 수와 일치하지 않습니다.

TP报바운드 변수 수가 토큰 수와 일치하지 않습니다.

WBOY
풀어 주다: 2016-10-11 14:23:11
원래의
1609명이 탐색했습니다.

  • PHP 버전: PHP 5.4.16

  • ThinkPHP 버전: 3.2.3

코드로 바로 이동:

<code>$data:

Array
(
    [area] => aa
    [brand] => bb
    [color] => cc
    [type] => 通勤车
    [alerted_police] => 0
    [status] => 0
    [lost_time] => 
    [info] => dd
    [email] => email@email.com
    [update_time] => 
    [timestamp] => 1
    [img_info_id] => 201610081621501801716297
)</code>
로그인 후 복사
로그인 후 복사

$sql = $ReportLost->fetchSql(true)->add($data);

<code>INSERT INTO `report_lost` (`area`,`brand`,`color`,`type`,`alerted_police`,`status`,`lost_time`,`info`,`email`,`update_time`) VALUES ('aa','bb','cc','通勤车','0','0',NULL,'dd','email@email.com',NULL)</code>
로그인 후 복사
로그인 후 복사

다음에 $result = $ReportLost->add($data);을 실행하면 오류가 발생합니다.

<code>ERR: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens</code>
로그인 후 복사
로그인 후 복사

단, $sql

은 mysql에서 직접 실행된다.
<code>mysql> INSERT INTO `report_lost` (`area`,`brand`,`color`,`type`,`alerted_police`,`status`,`lost_time`,`info`,`email`,`update_time`) VALUES ('aa','bb','cc','通勤车','0','0',NULL,'dd','email@email.com',NULL);
Query OK, 1 row affected (0.02 sec)</code>
로그인 후 복사
로그인 후 복사

삽입 가능합니다.

데이터 테이블 구조

<code>-- 表的结构 `report_lost`
--

CREATE TABLE IF NOT EXISTS `report_lost` (
  `id` int(11) NOT NULL,
  `title` varchar(80) CHARACTER SET utf8mb4 DEFAULT NULL,
  `keyword` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL,
  `area` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
  `brand` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
  `sub_brand` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
  `color` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `type` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `alerted_police` int(4) NOT NULL DEFAULT '0',
  `status` int(4) NOT NULL DEFAULT '0',
  `info` text CHARACTER SET utf8mb4,
  `image` text CHARACTER SET utf8mb4,
  `user` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
  `email` varchar(50) CHARACTER SET utf8mb4 NOT NULL,
  `contact` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
  `descrpition` text CHARACTER SET utf8mb4,
  `uuid` varchar(36) CHARACTER SET utf8mb4 DEFAULT '00000000-0000-0000-0000-000000000000',
  `lost_time` timestamp NULL DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;</code>
로그인 후 복사
로그인 후 복사

테이블에는 실제로 $data보다 더 많은 필드가 있지만 $data에 정의되지 않은 필드는 NULL이 될 수 있습니다.

이것이 thinkphp의 한계인가요? 아니면 php의 한계인가요? 해결책이 있나요? 먼저 $data에서 mysql에 필요한 모든 필드를 정의해야 합니까?

답글 내용:

  • PHP 버전: PHP 5.4.16

  • ThinkPHP 버전: 3.2.3

코드로 바로 이동:

<code>$data:

Array
(
    [area] => aa
    [brand] => bb
    [color] => cc
    [type] => 通勤车
    [alerted_police] => 0
    [status] => 0
    [lost_time] => 
    [info] => dd
    [email] => email@email.com
    [update_time] => 
    [timestamp] => 1
    [img_info_id] => 201610081621501801716297
)</code>
로그인 후 복사
로그인 후 복사

$sql = $ReportLost->fetchSql(true)->add($data);

<code>INSERT INTO `report_lost` (`area`,`brand`,`color`,`type`,`alerted_police`,`status`,`lost_time`,`info`,`email`,`update_time`) VALUES ('aa','bb','cc','通勤车','0','0',NULL,'dd','email@email.com',NULL)</code>
로그인 후 복사
로그인 후 복사

다음에 $result = $ReportLost->add($data);을 실행하면 오류가 발생합니다.

<code>ERR: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens</code>
로그인 후 복사
로그인 후 복사

단, $sql

은 mysql에서 직접 실행된다.
<code>mysql> INSERT INTO `report_lost` (`area`,`brand`,`color`,`type`,`alerted_police`,`status`,`lost_time`,`info`,`email`,`update_time`) VALUES ('aa','bb','cc','通勤车','0','0',NULL,'dd','email@email.com',NULL);
Query OK, 1 row affected (0.02 sec)</code>
로그인 후 복사
로그인 후 복사

삽입 가능합니다.

데이터 테이블 구조

<code>-- 表的结构 `report_lost`
--

CREATE TABLE IF NOT EXISTS `report_lost` (
  `id` int(11) NOT NULL,
  `title` varchar(80) CHARACTER SET utf8mb4 DEFAULT NULL,
  `keyword` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL,
  `area` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
  `brand` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
  `sub_brand` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
  `color` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `type` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `alerted_police` int(4) NOT NULL DEFAULT '0',
  `status` int(4) NOT NULL DEFAULT '0',
  `info` text CHARACTER SET utf8mb4,
  `image` text CHARACTER SET utf8mb4,
  `user` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
  `email` varchar(50) CHARACTER SET utf8mb4 NOT NULL,
  `contact` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
  `descrpition` text CHARACTER SET utf8mb4,
  `uuid` varchar(36) CHARACTER SET utf8mb4 DEFAULT '00000000-0000-0000-0000-000000000000',
  `lost_time` timestamp NULL DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;</code>
로그인 후 복사
로그인 후 복사

테이블에는 실제로 $data보다 더 많은 필드가 있지만 $data에 정의되지 않은 필드는 NULL이 될 수 있습니다.

이것이 thinkphp의 한계인가요? 아니면 php의 한계인가요? 해결책이 있나요? 먼저 $data에서 mysql에 필요한 모든 필드를 정의해야 합니까?

이 문제는 매우 이상합니다. MySQL 버전을 알려주실 수 있나요? 아니면 다른 숨겨진 문제가 있나요?

런타임/?에서 더 자세한 로그 보고서를 제공하세요.

TP3.2 버전의 모델 save() 메서드는 이미 필드 자동 필터링을 지원하므로 TP의 제한이 되어서는 안 되며, 저장하기 전에 모든 필드를 정의할 필요가 없습니다. 적어도 예외 없이 프로젝트에서 직접 save() 메서드를 사용합니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿