如何在PHP CLI CRUD应用中用fgets(STDIN)替代$_POST
把PHP CLI CRUD改成终端输入形式的解决方案
没问题!我来帮你把这个CLI应用改成用终端提示输入的形式,替换掉原来网页端的$_POST逻辑,同时还会帮你修复几个小问题,比如SQL注入风险和字段不匹配的问题。
首先,咱们先理清楚核心需求:在CLI里让用户一步步输入公司信息,然后调用addCompany函数把数据存入数据库。下面是修改后的完整代码,我会逐部分解释:
<?php echo "Welcome to Company Register App" . "\n\n"; // 数据库连接配置 define("DB_SERVER", "localhost"); define("DB_USER", "root"); define("DB_PASSWORD", "root"); define("DB_NAME", "mydatabase"); // 创建数据库连接 $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME); if ($mysqli === false) { die("Sorry, there seems to be a connection issue: " . $mysqli->connect_error); } else { echo "We are connected". "\n\n"; } /** * 添加公司信息到数据库 * @param mysqli $dbConn 数据库连接对象 */ function addCompany($dbConn) { // 提示用户输入信息,用trim去掉fgets自带的换行符 echo "Enter Company Name: "; $name = trim(fgets(STDIN)); echo "Enter Company Code: "; $code = trim(fgets(STDIN)); echo "Enter Company Phone: "; $phone = trim(fgets(STDIN)); echo "Enter Comment (optional): "; $comment = trim(fgets(STDIN)); // 使用预处理语句防止SQL注入,这比直接拼接字符串安全得多 // 注意:这里的表名改成你实际的表名,原代码里写的mydatabase应该是库名不是表名 $sql = "INSERT INTO companies (name, code, phone, comment) VALUES (?, ?, ?, ?)"; $stmt = $dbConn->prepare($sql); // 绑定参数:s代表字符串类型,四个参数对应四个? $stmt->bind_param("ssss", $name, $code, $phone, $comment); if ($stmt->execute()) { echo "\nCompany added successfully!"; } else { echo "\nError adding company: " . $stmt->error; } // 关闭语句和连接 $stmt->close(); } // 调用添加函数 addCompany($mysqli); // 关闭数据库连接 $mysqli->close(); ?>
关键修改点说明:
- 替换
$_POST为CLI输入:用fgets(STDIN)读取终端输入,搭配trim()去掉输入末尾的换行符,避免存入数据库的内容带多余换行。 - 数据库连接传参:把
$mysqli对象传到addCompany函数里,避免使用全局变量,代码更规范易维护。 - 修复SQL语句错误:原代码里的INSERT字段和值不匹配(写了
email字段但没有对应变量),我这里假设你的表结构是companies(你可以改成自己的实际表名),如果你的表有email字段,只需要加一个echo "Enter Company Email: "; $email = trim(fgets(STDIN));,然后修改SQL语句和绑定参数即可。 - 防止SQL注入:用预处理语句
prepare()和bind_param(),不管用户输入什么特殊字符,都不会破坏SQL结构,安全性更高。
运行方式:
把代码保存为company_register.php,然后在终端里运行:
php company_register.php
之后就会看到一步步的输入提示,按要求输入信息即可完成添加。
内容的提问来源于stack exchange,提问作者dotty
相关产品推荐
相关产品推荐

