Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL/PHP-PDO缓冲区是否可能溢出?_Php_Mysql_Sql_Pdo - Fatal编程技术网

MySQL/PHP-PDO缓冲区是否可能溢出?

MySQL/PHP-PDO缓冲区是否可能溢出?,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我现在正在编写一个网站。我将用户帐户存储在MySQL表中。 我使用PDO访问它们,因为它更安全,并且可以处理任何攻击。 我将用户名存储为VARCHAR24 但我的问题是:PDO是否处理溢出?例如,如果用户试图将其用户名的长度设置为25 不确定你是否做了显而易见的事情,只是尝试了一下自己,但是。。。不,PDO不是一个复杂的ORM。它不会浪费资源来解析SQL查询以确定要写入哪些表和列,并从服务器获取表定义以验证输入数据 根据您的MySQL配置,您的查询将因错误而失败,或者它将愉快地继续进行,您将得到

我现在正在编写一个网站。我将用户帐户存储在MySQL表中。 我使用PDO访问它们,因为它更安全,并且可以处理任何攻击。 我将用户名存储为VARCHAR24


但我的问题是:PDO是否处理溢出?例如,如果用户试图将其用户名的长度设置为25

不确定你是否做了显而易见的事情,只是尝试了一下自己,但是。。。不,PDO不是一个复杂的ORM。它不会浪费资源来解析SQL查询以确定要写入哪些表和列,并从服务器获取表定义以验证输入数据

根据您的MySQL配置,您的查询将因错误而失败,或者它将愉快地继续进行,您将得到数据丢失作为一项功能。但这一切都将发生在MySQL服务器上:

mysql> CREATE TABLE user (
    ->  user_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ->  username VARCHAR(24) NOT NULL,
    ->  PRIMARY KEY (user_id)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> SET @@SESSION.sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO user (username) VALUES ('this.is.a.very.long.username');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1265 | Data truncated for column 'username' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM user;
+---------+--------------------------+
| user_id | username                 |
+---------+--------------------------+
|       1 | this.is.a.very.long.user |
+---------+--------------------------+
1 row in set (0.00 sec)

mysql> SET @@SESSION.sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO user (username) VALUES ('this.is.also.a.very.long.username');
ERROR 1406 (22001): Data too long for column 'username' at row 1

我想说的是缓冲区溢出这个术语通常指的是什么,PHP和MySQL服务器的大部分都是用C语言编写的,C语言是一种低级语言,很容易受到攻击。但是,当然,两个开发团队都会尽最大努力避免它,如果你遇到一个问题,它将是一个错误的结果,它应该被报告为潜在的安全漏洞,并且它不太可能是由你描述的简单案例引起的。

不确定你是否做了显而易见的事情,只是自己尝试了一下,但是。。。不,PDO不是一个复杂的ORM。它不会浪费资源来解析SQL查询以确定要写入哪些表和列,并从服务器获取表定义以验证输入数据

根据您的MySQL配置,您的查询将因错误而失败,或者它将愉快地继续进行,您将得到数据丢失作为一项功能。但这一切都将发生在MySQL服务器上:

mysql> CREATE TABLE user (
    ->  user_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ->  username VARCHAR(24) NOT NULL,
    ->  PRIMARY KEY (user_id)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> SET @@SESSION.sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO user (username) VALUES ('this.is.a.very.long.username');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1265 | Data truncated for column 'username' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM user;
+---------+--------------------------+
| user_id | username                 |
+---------+--------------------------+
|       1 | this.is.a.very.long.user |
+---------+--------------------------+
1 row in set (0.00 sec)

mysql> SET @@SESSION.sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO user (username) VALUES ('this.is.also.a.very.long.username');
ERROR 1406 (22001): Data too long for column 'username' at row 1

我想说的是缓冲区溢出这个术语通常指的是什么,PHP和MySQL服务器的大部分都是用C语言编写的,C语言是一种低级语言,很容易受到攻击。但是,当然,两个开发团队都会尽最大努力避免它,如果您遇到一个问题,它将是一个错误的结果,应该报告为潜在的安全漏洞,并且它不太可能是由您描述的简单情况引起的。

PDO默认情况下不关心长度。如果使用MySQL作为数据库,此单元格将自动截断为字段长度

默认情况下,PDO不关心长度。如果使用MySQL作为数据库,此单元格将自动截断为字段长度

MySQL会将其截断为24个字符。无论您在PHP中使用什么API,都是在数据库中处理的。PDO不会做任何类似的事情。由数据库来处理这种情况。我将取决于数据库,当您试图将过长的字符串存储在过短的字段中时,它会做什么。最有可能的情况是该值被截断。您当然不需要担心内存缓冲区溢出;您正在使用的SQL API远远高于此值。MySQL会将其截断为24个字符。无论您在PHP中使用什么API,都是在数据库中处理的。PDO不会做任何类似的事情。由数据库来处理这种情况。我将取决于数据库,当您试图将过长的字符串存储在过短的字段中时,它会做什么。最有可能的情况是该值被截断。您当然不需要担心内存缓冲区溢出;您正在使用的SQL API远远高于此。