有一个送货服务,客户在其中注册,每个客户可以通过在他的帐户中填写表格来添加多个收件人。
这是收件人的表格:
CREATE TABLE x_receivers (
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
id_client bigint(20) UNSIGNED NOT NULL,
surname varchar(255) NOT NULL,
name varchar(255) NOT NULL,
patronymic varchar(255) NOT NULL,
ps_type tinyint(1) UNSIGNED NOT NULL COMMENT 'тип документа',
ps_serial varchar(255) NOT NULL,
ps_num varchar(255) NOT NULL,
ps_code varchar(255) NOT NULL,
ps_who varchar(255) NOT NULL,
ps_when char(14) NOT NULL,
postcode char(12) NOT NULL,
country varchar(255) NOT NULL,
area varchar(255) NOT NULL,
city varchar(255) NOT NULL,
street varchar(255) NOT NULL,
house char(12) NOT NULL,
room char(12) NOT NULL,
sort tinyint(3) UNSIGNED NOT NULL,
scan_1 varchar(255) NOT NULL COMMENT 'скан первой стр. паспорта',
scan_2 varchar(255) NOT NULL COMMENT 'скан прописки',
inn varchar(255) DEFAULT NULL,
house_korp varchar(255) DEFAULT NULL,
citizenship varchar(255) DEFAULT NULL,
b_date char(14) DEFAULT NULL COMMENT 'Дата рождения',
phone varchar(255) DEFAULT NULL,
email varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
)
ENGINE = MYISAM,
AUTO_INCREMENT = 37299,
AVG_ROW_LENGTH = 341,
CHARACTER SET utf8,
CHECKSUM = 0,
COLLATE utf8_general_ci;
ALTER TABLE x_receivers
ADD INDEX id_client (id_client);
客户端模型(将数据保存和写入数据库的部分)
/**
* Получаем сохраненные адреса покупателя
*
* @deprecated
*
* @param bool $id
*
* @return mixed
*/
public static function getAddresses($id = false) {
$user_id = $id ? (int)$id : (int)Client::get('id');
return DB::fetch('select address from #prefix#addresses where id_client = ? order by sort asc', $user_id);
}
/**
* Сохраняем паспортные данные получателей
*
* @param array $receivers
*/
public static function saveReceivers(&$receivers = array()) {
$user_id = (int)Client::get('id');
$receivers_ids = DB::shift_array('select id from #prefix#receivers where id_client = ?', $user_id);
$receivers_ids = $receivers_ids ? $receivers_ids : array();
DB::execute('delete from #prefix#receivers where id_client = ?', $user_id);
if ( $receivers ) {
foreach( $receivers as $i => $receiver ) {
$fields = array();
foreach( $receiver as $key => $field ) {
if ( $key == 'id' ) {
// если передается id, проверяем, чтобы он ранее пренадлежал текущему пользователю;
// т.о. защищаем подмену чужого получателя
if ( array_search((int)$field, $receivers_ids) === false ) {
continue;
}
}
// фильтруем значение от всякого мусора
$fields[ $key ] = "'" . preg_replace('#[^\w\d\s\-\.\,\@\/]#ui', '', $field) . "'";
}
$fields['sort'] = $i;
// insert по одному, потому что у каждой записи может быть разный набор заполненных полей
DB::execute('insert into #prefix#receivers (id_client, ' . join(', ', array_keys($fields)) . ") values ($user_id, " . join(', ', $fields) . ')');
// \clients\ReceiversHistory::saveItem(DB::last_id());
}
}
@setcookie('receivers', count($receivers), time() + conf('General', 'session_duration'), '/', $_SERVER['HTTP_HOST'], false, true);
}
/**
* Получаем данные всех получателей клиента
*
* @param int|bool $id
* @param bool $all
*
* @return object|bool
*/
public static function getReceivers($id = false, $all = false) {
$user_id = $id ? (int)$id : (int)Client::get('id');
if ( $id && !$all ) {
// получаем данные конкретного получателя
return DB::single('select * from #prefix#receivers where id = ? order by sort asc', $user_id);
}
$receivers = DB::fetch('select * from #prefix#receivers where id_client = ? order by surname', $user_id);
if ($receivers) {
foreach( $receivers as $item ) {
$item->regionid=Cities::getregionid($item->city,$item->country);
}
}
@setcookie('receivers', count($receivers), time() + conf('General', 'session_duration'), '/', $_SERVER['HTTP_HOST'], false, true);
return $receivers;
}
/**
* Имеются ли у текущего пользователя получатели
*
* @return bool
*/
public static function hasReceivers() {
if ( empty(self::getReceivers()) ) {
return false;
}
return true;
}
/**
* Принадлежит ли указанный получатель текущему пользователю
*
* @param int $receiver_id
*
* @return boolean
*/
public static function receiverExist($receiver_id) {
return !!DB::shift('select id from #prefix#receivers where id_client = ? and id = ? order by sort asc limit 1', Client::$user->id, (int)$receiver_id);
}
当客户有 40 多个收件人时会出现问题,即如果您填写 41 个收件人的表格,他不会进入数据库。如果您反其道而行之(直接通过数据库添加),则将显示 41 个收件人。可能是什么问题呢?首先应该调试什么以及如何调试?
- 玛丽亚数据库 10.1
- php7.0
- 象形文字
从代码来看(删除以前的条目),您同时发送了所有 40 个条目。
在您的表中有 27 个字段,乘以 40 条记录将是近 1200 个变量。
PHP 有一个选项
max_input_vars可以限制传递的变量数量。默认值为 1000,您已经超过了它。(我们可以得出结论,您显然正在发送 27 个字段中的 25 个字段,id自动生成,client_id从会话中在服务器端填写而不是传输是合乎逻辑的)。所以要么增加变量数量的限制,要么批量发送数据到服务器。第一个选项不需要更改代码。