4 回答
TA贡献1772条经验 获得超8个赞
由于各种原因,查询可能失败,在这种情况下,mysql_*和mysqli扩展都将返回false
它们各自的查询函数/方法。您需要测试该错误条件并相应地处理它。
MySQL_*扩展:
注这个不推荐MySQL函数并已在php版本7中删除。
查帐$result
在把它传给mysql_fetch_array
。你会发现false
因为查询失败。见mysql_query
可能返回值的文档以及如何处理这些值的建议。
$username = mysql_real_escape_string($_POST['username']);$password = $_POST['password'];$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");if($result === FALSE) { die(mysql_error()); // TODO: better error handling}while($row = mysql_fetch_array($result)){ echo $row['FirstName'];}
$username = mysqli_real_escape_string($mysqli, $_POST['username']);$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");// mysqli_query returns false if something went wrong with the queryif($result === FALSE) { yourErrorHandler(mysqli_error($mysqli));}else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ...
欧式:
$username = $mysqli->escape_string($_POST['username']);$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { yourErrorHandler($mysqli->error); // or $mysqli->error_list}else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ...
使用准备好的陈述:
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');if ( !$stmt ) { yourErrorHandler($mysqli->error); // or $mysqli->error_list}else if ( !$stmt->bind_param('s', $_POST['username']) ) { yourErrorHandler($stmt->error); // or $stmt->error_list}else if ( !$stmt->execute() ) { yourErrorHandler($stmt->error); // or $stmt->error_list}else { $result = $stmt->get_result(); // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ...
TA贡献1804条经验 获得超7个赞
当查询中出现导致查询失败的错误时,将显示此错误消息。当使用:
mysql_fetch_array
/mysqli_fetch_array()
mysql_fetch_assoc()
/mysqli_fetch_assoc()
mysql_num_rows()
/mysqli_num_rows()
注这个错误确实不如果您的查询没有影响任何行,则显示。只有具有无效语法的查询才会生成此错误。
故障排除步骤
确保将开发服务器配置为显示所有错误。通过将其放置在文件的顶部或配置文件中,可以做到这一点:
error_reporting(-1);
。如果您有任何语法错误,这将指向您。使用
mysql_error()
.mysql_error()
将报告执行查询时MySQL遇到的任何错误。样本使用情况:
mysql_connect($host, $username, $password) or die("cannot connect"); mysql_select_db($db_name) or die("cannot select DB"); $sql = "SELECT * FROM table_name";$result = mysql_query($sql);if (false === $result) { echo mysql_error();}
从MySQL命令行或类似于phpMyAdmin。如果查询中有语法错误,这将告诉您它是什么。
确保你的引号是正确的。查询周围缺少的引号或值会导致查询失败。
确保你在逃避你的价值观。查询中的引号会导致查询失败(还会让您对SQL注入开放)。使用
mysql_real_escape_string()
逃避你的输入。确保你没有混合
mysqli_*
和mysql_*
职能。它们不是一回事,不能一起使用。(如果你要选择一个或另一个坚持mysqli_*
。见下文的原因。)
TA贡献1859条经验 获得超6个赞
'
mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string ($username)."' ");
mysql_real_escape_string
mysql_real_escape_string
添加回答
举报