PHP7表单报错:mysqli对象无法转换为int的问题求助
错误原因分析及解决方法
核心错误原因
你遇到的Object of class mysqli could not be converted to int错误,根源在于数据库连接状态判断的类型不匹配:
mysqli_connect()成功时返回的是一个mysqli对象,失败时返回false(布尔值)。- 你用
if ($conn == 0)来判断连接失败,PHP会尝试把mysqli对象转换成整数,这就触发了这个类型转换错误。
另外你的代码还有两个额外问题,虽然不是当前报错的直接原因,但也会导致功能异常或安全风险:
- 多余且错误的
mysqli_select_db()调用:你在mysqli_connect()的第四个参数已经指定了数据库coinlion,不需要再调用这个函数;就算要调用,正确写法是mysqli_select_db($conn, "coinlion")(必须传入连接对象)。 - 严重的SQL注入风险:直接把
$_POST的原始值拼进SQL语句里,这是非常危险的操作,很容易被攻击者利用。
修复后的完整代码
<?php // 连接数据库,正确判断连接状态 $conn = mysqli_connect("localhost", "root", "", "coinlion"); if (!$conn) { // 直接判断布尔值,避免类型转换 echo "Could not connect: " . mysqli_connect_error(); // 加上错误信息更便于调试 } else { echo "Connected"; } ?> <form method="post"> <style>#newlink { width: 600px }</style> <div id="newlink"> <div> <table border=0> <tr><td> Link URL:</td><td><input type="text" name="linkurl" value="" required></td></tr> <tr><td> Link Description:</td><td><textarea name="linkdesc" cols="50" rows="5" required></textarea></td></tr> </table> </div> </div> <p><br><input type="submit" name="submit1"><input type="reset" name="reset1"></p> <?php if (isset($_POST['submit1'])) { // 使用预处理语句防止SQL注入 $linkurl = $_POST['linkurl']; $linkdesc = $_POST['linkdesc']; // 准备SQL模板 $stmt = mysqli_prepare($conn, "INSERT INTO test(linkurl, linkdesc) VALUES (?, ?)"); // 绑定参数(s代表字符串类型) mysqli_stmt_bind_param($stmt, "ss", $linkurl, $linkdesc); // 执行语句 if (mysqli_stmt_execute($stmt)) { echo "Data inserted successfully"; } else { echo "Insert error: " . mysqli_stmt_error($stmt); } // 关闭语句 mysqli_stmt_close($stmt); } ?>
关键修复点说明
- 连接判断:把
$conn == 0改成!$conn,直接利用PHP的布尔类型判断,避免对象和整数的类型转换。 - 移除多余的
mysqli_select_db():因为mysqli_connect已经指定了数据库,重复调用反而可能出错。 - SQL注入防护:使用mysqli预处理语句(
mysqli_prepare+mysqli_stmt_bind_param),避免直接拼接用户输入到SQL中,这是Web开发的基础安全规范。 - 增加错误提示:在连接失败和插入失败时输出具体错误信息,方便调试问题。
内容的提问来源于stack exchange,提问作者AmalJo
相关产品推荐
相关产品推荐

