首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当sql列类型从文本更改为varchar时,无法登录到php页面

当sql列类型从文本更改为varchar时,无法登录到php页面
EN

Stack Overflow用户
提问于 2015-04-17 14:32:39
回答 1查看 66关注 0票数 3

当密码的列类型为文本时,我的登录页就可以正常工作。我已经更新了表内容,并且习惯了密码上的sql密码函数,但是现在格式是varchar,页面将不进行身份验证。

以下是有关的守则:

代码语言:javascript
运行
复制
<main>
            <?php 
                if(isset($_POST['submit'])){
                    include 'databaselogin.php';

                    $username = ucfirst(strtolower($_POST['username']));
                    $username = mysqli_real_escape_string($mysqli, $username);
                    $password = $_POST['password'];

                    $sql = "SELECT *
                            FROM teams
                            WHERE name = '$username'";
                    $result = $mysqli->query($sql) or die($mysqli->error.__LINE__);

                    if($result->num_rows == 1){
                        $row = $result->fetch_assoc();
                        $hash = $row["password"];

                        if(password_verify($password,$hash)){
                            session_start();
                            $_SESSION["username"] = $row["name"];

                            header("Location: http://www.josephade.com/fyp/dashboard.php");
                            die();
                        }
                    }else{
                        //Show error incorrect password
                        include 'error.php';
                    }

                    mysqli_close($mysqli);
                }
            ?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-17 15:30:43

如MySQL文档中所示,BLOBTEXT都是相关的。

  • http://dev.mysql.com/doc/refman/5.6/en/blob.html

11.4.3 BLOB和文本类型

如果未启用严格SQL模式,并且为超过该列最大长度的BLOB或TEXT列分配了一个值,则会截断该值以使其适合,并生成警告。对于非空格字符的截断,可以使用严格的SQL模式导致错误(而不是警告)并抑制值的插入。

这就解释了数据丢失的原因。

  • 因此,从文本到VARCHAR需要完全重建,正如我在评论中提到的那样:

“那你就得重建你的哈希了”

我在这方面发现的另一个联系是:

  • http://nicj.net/mysql-text-vs-varchar-performance/

从该页部分检索:

从MySQL 5.0.3开始,VARCHAR字段的最大字段长度从255个字符增加到65,535个字符。这是个好消息,因为VARCHAR字段(而不是文本字段)存储在MyISAM存储引擎的行中(InnoDB具有不同的特性)。文本和BLOB字段不存储在行中--如果它们的列包含在SELECT子句中,则需要单独查找(以及潜在的磁盘读取)。此外,在任何类型中包含文本或BLOB列将强制排序使用基于磁盘的临时表,这是用于临时表的内存(堆)存储引擎所要求的。 因此,对于255到65k字符的列,使用VARCHAR字段而不是文本的好处乍一看是显而易见的:对于包括列在内的查询(由于没有行外数据)和更少的写入(包括列在内的查询)和更少的写入(包括列在内的查询),这种好处是显而易见的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29702114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档