如何解决PHP上传CSV到MAMP MySQL数据库的连接及权限问题
问题解决步骤
一、修复「http://localhost:8888 Forbidden」错误
- 修改MAMP文档根目录:
- 打开MAMP,点击顶部菜单栏「MAMP」→「偏好设置」→「Web Server」。
- 在「Document Root」选项中,选择你的脚本所在的父目录(比如
/Users/davidelks/Dropbox/Personal/php/sites)。 - 重启MAMP的Apache服务(点击MAMP主界面的「Stop Servers」再「Start Servers」)。
- 修正目录/文件权限:
打开终端,执行以下命令:chmod -R 755 /Users/davidelks/Dropbox/Personal/php/sites chmod 644 /Users/davidelks/Dropbox/Personal/php/sites/csv_converter/test_connection.php
二、解决数据库连接错误
1. 修复「Unknown database 'houston'」
- 方式一:通过phpMyAdmin创建数据库
访问http://localhost:8888/phpMyAdmin,登录后点击左侧「新建」,输入数据库名houston,点击「创建」。 - 方式二:终端执行SQL命令
打开终端,输入MAMP的MySQL登录命令:
输入密码/Applications/MAMP/Library/bin/mysql -u root -proot后,执行创建数据库命令:CREATE DATABASE houston;
2. 修复「Access denied for user 'root'@'localhost'」
- 修正MySQL端口和IP拼写错误:
MAMP默认MySQL端口是8889(8888是Apache端口),且你脚本里的IP地址127.0.01少了一个点,正确应为127.0.0.1。修改连接代码:$elements = array( "host" => "127.0.0.1:8889", "username" => "root", "password" => "root", "dbname" => "houston" ); $database = new mysqli($elements['host'], $elements['username'], $elements['password'], $elements['dbname']); - 确认用户权限:
登录phpMyAdmin,点击「用户账户」,找到root@localhost,检查权限是否包含houston数据库的读写权限,若没有则添加对应权限。
三、优化脚本避免其他问题
1. 修正CSV文件路径
相对路径容易出错,改用绝对路径:
$csv_file = fopen('/Users/davidelks/Dropbox/Personal/php/baby_names/df2.csv', 'r');
若仍打不开,添加错误详情:
if (!$csv_file) { die("Failed to open file: " . error_get_last()['message']); }
2. 替换SQL拼接为预处理语句(防注入+更稳定)
把原来的循环拼接SQL部分替换为:
while (($line = fgetcsv($csv_file)) !== FALSE) { $columns = []; $values = []; foreach ($line as $key => $value) { if (isset($columnMapping[$headers[$key]])) { $columns[] = $columnMapping[$headers[$key]]; $values[] = $database->real_escape_string($value); } } if (empty($columns)) continue; // 跳过空行 $columnsStr = implode(", ", $columns); $placeholders = implode(", ", array_fill(0, count($values), "?")); $stmt = $database->prepare("INSERT INTO baby_data ($columnsStr) VALUES ($placeholders)"); // 绑定参数:str_repeat("s", count($values)) 表示所有参数都是字符串类型 $stmt->bind_param(str_repeat("s", count($values)), ...$values); if (!$stmt->execute()) { echo "Error executing query: " . $stmt->error . "<br>"; } $stmt->close(); }
3. 确保表结构匹配
确认baby_data表的字段(Name、Gender、Value、Year、Measure)存在,且字段类型与CSV数据匹配(比如Year设为INT,Value设为FLOAT或INT等)。
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

