RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 947380
Accepted
Егор Rmd
Егор Rmd
Asked:2020-02-21 04:50:21 +0000 UTC2020-02-21 04:50:21 +0000 UTC 2020-02-21 04:50:21 +0000 UTC

为什么超过 40 个收件人没有存储在数据库中?

  • 772

有一个送货服务,客户在其中注册,每个客户可以通过在他的帐户中填写表格来添加多个收件人。

这是收件人的表格:

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
  • 象形文字
php
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    teran
    2020-02-21T16:23:35Z2020-02-21T16:23:35Z

    从代码来看(删除以前的条目),您同时发送了所有 40 个条目。
    在您的表中有 27 个字段,乘以 40 条记录将是近 1200 个变量。

    PHP 有一个选项max_input_vars可以限制传递的变量数量。默认值为 1000,您已经超过了它。(我们可以得出结论,您显然正在发送 27 个字段中的 25 个字段,id自动生成,client_id从会话中在服务器端填写而不是传输是合乎逻辑的)。

    max_input_vars整数

    一个请求中可以接受多少个输入变量(每个全局变量都有限制$_GET,$_POST并且$_COOKIE分别)。使用此指令可减少使用哈希冲突进行攻击时失败的机会。如果输入变量的数量多于指令指定的数量,则会引发警告E_WARNING并忽略查询中的所有后续变量。

    所以要么增加变量数量的限制,要么批量发送数据到服务器。第一个选项不需要更改代码。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5