简介:这份资源是面向PHP初学者与Web开发入门者的MySQL数据库连接实践项目,围绕mysql_connect函数展开,帮助读者理解PHP与MySQL服务器建立通信的基本流程。压缩包共15个文件,约17KB,以vb源码文件为主,辅以resx资源文件、vbproj项目文件、sln解决方案及myapp、settings等配置项,构成一个可直接在Visual Studio中打开运行的连接示例工程,便于对照调试与二次修改。内容涉及连接参数设置、连接标识符判断、错误处理与连接关闭等关键环节,并延伸对比mysqli与PDO两种现代扩展的用法,提示mysql_connect在PHP 5.5后废弃、PHP 7.0移除的兼容性风险,同时强调凭据管理与预处理语句等安全实践。目前已有215人学习,适合需要快速上手数据库连接、理解新旧扩展差异并规避常见安全问题的开发者参考。
1. 从一份 VB.NET 工程看 MySQL 连接:它到底能跑通什么
很多人看到MySQL_Connection_Project.rar这个名字,第一反应是「PHP 连 MySQL 的示例代码」,毕竟mysql_connect这个函数名太有年代感了。但把压缩包解开你会发现,里面躺着的是Form1.vb、MySQL_Connection_Project.vbproj、MySQL_Register+Login.vb、My Project目录和.sln解决方案文件——这是一份标准的 VB.NET WinForms 工程,不是 PHP 脚本。这个反差本身就是它最大的价值:它演示的是在 .NET 桌面程序里,怎么把注册、登录这类最基础的用户体系,真正落到 MySQL 数据库上。
如果你正在用 VB.NET 做课程设计、做内部小工具,或者接手了一个老 WinForms 项目要补数据库登录模块,这份工程能直接给你一套可编译、可调试的骨架。它解决的不是「MySQL 是什么」这种概念问题,而是「窗体按钮点下去,怎么把用户名密码写进库、怎么查出来比对」这种落地问题。适合有基础 VB.NET 语法、但对 ADO.NET 连接串和参数化查询还不熟的人。下面我按拆包、配环境、跑通、排错的顺序,把这份资源讲透。
2. 拆开压缩包:文件清单与 VB.NET 工程结构怎么读
2.1 目录里每个文件是干什么的
先把压缩包解压到一个纯英文路径下,中文路径在 VB.NET 老工程里偶尔会让My Project下的资源文件解析出问题。解压后你会看到这样一批文件,我按作用分了三类:
| 文件/目录 | 类型 | 作用 |
|---|---|---|
MySQL_Connection_Project.sln | 解决方案文件 | 双击它用 Visual Studio 打开整个工程 |
MySQL_Connection_Project.vbproj | 项目文件 | 定义编译目标、引用、输出类型 |
Form1.vb/Form1.Designer.vb/Form1.resx | 窗体三件套 | 主界面逻辑、控件布局代码、窗体资源 |
MySQL_Register+Login.vb | 业务代码 | 注册与登录的核心逻辑,连接数据库就在这里 |
My Project目录 | 工程配置 | AssemblyInfo.vb、Settings.settings、Resources.resx等 |
bin/obj | 编译输出 | bin\Release、bin\Debug、obj\x86是历史编译产物 |
.suo/.vbproj.user | 用户配置 | 记录你本机的窗口布局和调试设置,可删 |
bin和obj里的东西是别人编译过的残留,你重新生成解决方案时会覆盖,不用管。真正要读的是MySQL_Register+Login.vb和Form1.vb。
2.2 用 Visual Studio 打开并确认目标框架
打开.sln后,右键项目 → 属性,重点看两个地方:目标框架(Target Framework)和引用(References)。老工程常见的是 .NET Framework 4.x,如果你机器上只装了 .NET 6/8 的 SDK,打开时会提示需要安装对应的 .NET Framework 开发包。这一步别跳过,框架不匹配后面全是编译错误。
# 如果你习惯命令行,可以用 msbuild 先探一下工程能不能被识别 msbuild MySQL_Connection_Project.sln /t:Build /p:Configuration=Debug这条命令的作用是让 MSBuild 按 Debug 配置编译整个解决方案。/t:Build指定构建目标,/p:Configuration=Debug指定配置。如果报「找不到 Microsoft.VisualBasic.targets」之类的错,基本就是 .NET Framework 开发组件没装全,去 Visual Studio Installer 里勾上「.NET 桌面开发」工作负载即可。编译通过后,bin\Debug下会生成.exe,说明工程结构是完整的。
2.3 连接字符串藏在哪
VB.NET 工程里数据库连接串一般有两个去处:一是My Project\Settings.settings里定义的应用程序设置,二是直接硬编码在业务.vb文件里。这份工程属于后者,打开MySQL_Register+Login.vb,你会看到类似Server=localhost;Database=xxx;Uid=root;Pwd=xxx;的字符串。先把它记下来,下一步配数据库时要用。注意,硬编码凭据是这份老工程的一个典型问题,后面避坑章节会专门讲怎么改。
3. 把连接跑起来:MySQL 建库、建表与 VB.NET 连接代码
3.1 先在 MySQL 里把库和表准备好
工程能编译不代表能登录,数据库那头得先有对应的库和表。常见做法是建一个test_db,再建一张users表存账号密码。字段设计上,用户名唯一、密码别存明文,这是底线。
-- 建库 CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE test_db; -- 建用户表 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;utf8mb4是为了兼容中文用户名和特殊字符,UNIQUE约束保证注册时不会出现重复账号,InnoDB引擎支持事务,后面如果要加注册即写日志的逻辑会方便。执行完用SELECT * FROM users;确认表结构没问题。
3.2 VB.NET 里用 MySqlConnector 建立连接
原工程如果用的是MySql.Data(Oracle 官方驱动),在新版 MySQL 8 上可能会遇到认证插件不兼容的问题。我一般会换成MySqlConnector这个开源驱动,兼容性和性能都更稳。在项目里通过 NuGet 安装:
# 在 Visual Studio 的「程序包管理器控制台」里执行 Install-Package MySqlConnector装完后,在MySQL_Register+Login.vb顶部引入命名空间,然后写连接和查询逻辑:
Imports MySqlConnector Public Class MySQL_Register_Login ' 连接字符串:生产环境请从配置文件读取,不要硬编码 Private Const ConnStr As String = "Server=localhost;Port=3306;Database=test_db;Uid=root;Pwd=你的密码;SslMode=None;" ' 登录校验:用参数化查询防注入 Public Function CheckLogin(userName As String, passWord As String) As Boolean Dim sql As String = "SELECT COUNT(*) FROM users WHERE username = @u AND password = @p" Using conn As New MySqlConnection(ConnStr) Using cmd As New MySqlCommand(sql, conn) ' 参数绑定,@u 和 @p 会被安全转义 cmd.Parameters.AddWithValue("@u", userName) cmd.Parameters.AddWithValue("@p", passWord) Try conn.Open() Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar()) Return count > 0 Catch ex As MySqlException ' 连接失败或 SQL 错误都在这里,别吞掉异常 MessageBox.Show("数据库错误:" & ex.Message) Return False End Try End Using End Using End Function End Class这段代码的关键点有三个。第一,Using块保证连接和命令对象用完即释放,不用手动Close。第二,AddWithValue把用户输入当参数传,而不是拼字符串,这是防 SQL 注入的核心。第三,ExecuteScalar只取第一行第一列,用来做COUNT判断登录是否成立最省事。SslMode=None是本地开发图方便,线上要按实际证书情况调整。
3.3 注册逻辑与窗体按钮绑定
注册就是把上面反过来,先查用户名是否存在,不存在就插入。在Form1.vb的按钮点击事件里调用:
Private Sub btnRegister_Click(sender As Object, e As EventArgs) Handles btnRegister.Click Dim biz As New MySQL_Register_Login() If biz.UserExists(txtUser.Text) Then MessageBox.Show("该用户名已被注册") Return End If If biz.RegisterUser(txtUser.Text, txtPwd.Text) Then MessageBox.Show("注册成功,请登录") Else MessageBox.Show("注册失败,请查看日志") End If End SubUserExists和RegisterUser两个方法按 3.2 的写法扩展即可,插入用INSERT INTO users (username, password) VALUES (@u, @p)。密码这里演示用的是明文,实际项目务必先做哈希(如 BCrypt)再入库,这一点在避坑章节展开。
4. 连接失败排查:从报错信息定位到具体环节
4.1 现象:提示「Unable to connect to any of the specified MySQL hosts」
原因通常有三层:MySQL 服务没启动、端口不对、或者主机地址写错。先在服务里确认 MySQL 正在运行,再用netstat -ano | findstr 3306看端口是否在监听。如果服务在跑但端口不通,检查my.ini里的bind-address是不是被限制成了127.0.0.1而你用了别的地址。解决方式是把连接串的Server改成127.0.0.1试一次,排除 DNS 解析干扰。
4.2 现象:报「Authentication method 'caching_sha2_password' is not supported」
这是 MySQL 8 默认认证插件和旧驱动不匹配的经典问题。原因是你用的MySql.Data版本太老,不认识caching_sha2_password。解决办法有两个:一是按 3.2 换成MySqlConnector;二是把该用户的认证方式改回mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;改完记得重启连接,FLUSH PRIVILEGES让权限表立即生效。
4.3 现象:中文用户名注册后变成乱码或问号
原因是数据库、表、连接三处的字符集不一致。检查SHOW VARIABLES LIKE 'character%';,确保character_set_server和character_set_database都是utf8mb4。连接串里也可以显式加CharacterSet=utf8mb4;。表建的时候如果漏了DEFAULT CHARSET=utf8mb4,用ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4;补救。
4.4 现象:编译报「类型 'MySqlConnection' 未定义」
说明 NuGet 包没装成功,或者Imports写错了。先确认「引用」里能看到MySqlConnector,再确认文件顶部是Imports MySqlConnector而不是Imports MySql.Data.MySqlClient。两个驱动命名空间不同,混用必报错。如果项目里同时装了新旧两个驱动,建议卸掉MySql.Data,避免类型冲突。
4.5 现象:登录一直返回 False,但数据库里明明有数据
先别怀疑代码,用SELECT * FROM users WHERE username = '你测试的账号';在 MySQL 客户端里手动查一次。如果查得到,问题多半在参数传递上——比如窗体文本框里多了空格。在CheckLogin里加一句userName = userName.Trim()再传参。另外确认密码字段比对时没有大小写或编码差异。
5. 从能跑到能用:凭据外置、密码哈希与连接池三个进阶动作
5.1 把连接串从代码里挪出去
硬编码凭据是这份工程最该改的地方。VB.NET 里可以用App.config存连接串,代码里通过ConfigurationManager.ConnectionStrings读:
<!-- App.config --> <configuration> <connectionStrings> <add name="MySqlConn" connectionString="Server=localhost;Database=test_db;Uid=app_user;Pwd=强密码;SslMode=None;" providerName="MySqlConnector" /> </connectionStrings> </configuration>Imports System.Configuration Private Function GetConnStr() As String Return ConfigurationManager.ConnectionStrings("MySqlConn").ConnectionString End Function这样换环境只改配置文件,不用重新编译。数据库账号也别用 root,单独建一个只有SELECT、INSERT权限的app_user,把权限收到最小。
5.2 密码哈希:别让数据库泄露等于账号泄露
明文存密码的后果不用多说。VB.NET 里可以用BCrypt.Net-Next这个 NuGet 包,注册时哈希、登录时校验:
Imports BCrypt.Net ' 注册:存哈希 Dim hashed As String = BCrypt.HashPassword(txtPwd.Text) ' 入库时 password 字段存 hashed ' 登录:校验 Dim stored As String = GetStoredHash(userName) ' 从库里取出哈希 Dim ok As Boolean = BCrypt.Verify(txtPwd.Text, stored)HashPassword每次生成的盐不同,所以同一个密码两次哈希结果不一样,这是正常的。Verify会自动从存储的哈希里提取盐来比对,你不需要自己管盐。这一步做完,即使数据库被拖库,攻击者也拿不到明文密码。
5.3 连接池:别每次点击都重开连接
MySqlConnector默认开启连接池,但前提是你用相同的连接字符串。如果你在代码里动态拼串(比如带时间戳),池就失效了。正确做法是连接串保持稳定,Open时从池里取、Dispose时归还。可以在连接串里显式控制池行为:
Server=localhost;Database=test_db;Uid=app_user;Pwd=xxx;Pooling=true;MinimumPoolSize=1;MaximumPoolSize=10;MinimumPoolSize是池里保底连接数,MaximumPoolSize是上限。桌面程序并发不高,10 足够。设太大反而占数据库连接数。验证池是否生效,可以在 MySQL 里执行SHOW STATUS LIKE 'Threads_connected';,反复登录退出,看连接数是否稳定而不是一路涨。
5.4 一个我自己的习惯
从那以后我每次接手这种带数据库连接的 WinForms 老工程,都强制先做三件事:把连接串挪进配置文件、把 root 换成最小权限账号、把明文密码换成哈希。这三步不做完,功能跑通了我也不敢往下写业务。希望这份拆解能帮到你,少走几个连接失败的弯路。
本文还有配套的精品资源,点击获取