如果找不到该值,则不会显示任何消息



我有以下示例数据库:

rfidtags` (`name`, `id`, `gender`, `email`, `mobile`) VALUES
('Alsan', '39EAB06D', 'Male', 'mydigitalnepal@gmail.com', '9800998787'),
('John', '769174F8', 'Male', 'john@email.com', '23456789'),
('Thvhm,b', '81A3DC79', 'Female', 'jgkhkkmanjil@gmail.com', '45768767564'),

和以下代码:

<?php
$mysql_host = 'localhost';
$mysql_port = '';
$mysql_user = 'user';
$mysql_pass = 'password';
$mysql_mydb = 'rfidcards';
$con = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_mydb );
if ($con -> connect_errno) {
echo "Failed to connect to MySQL: " . $con -> connect_error;
exit(2);
}
//$tagid = '39EAB06D'; 
$tagid = 'CCCCCCCC'; 
$query = "SELECT name, id  FROM rfidtags WHERE id = '$tagid'";
if ($stmt = $con->prepare($query)) {
$stmt->execute();
$stmt->bind_result($name, $id);
$stmt->fetch();
// debug init
//var_dump($stmt);
// debug end

echo "$name $idn";
$stmt->close();
} else {
echo "failed to fetch datan";
}
$con->close();

标记tagid='39EAB06D'和tagid='CCCCCCC'用于测试目的。

当选择第一个时,显示ressult,但当选择第二个(数据库中不存在(时,显示空行,而不是";未能获取数据";

您的echo "failed to fetch datan";位于错误的位置。$con->prepare($query)只会在准备语句时出错时返回false,而不是在语句未返回任何条目时返回false。

你会想对你的提取进行if检查,比如:

if($stmt->fetch()) {
echo "$name $idn";
} else {
echo "No result returned";
}

mysqli::prepare()在查询返回零条记录时不会失败。事实上,检查prepare是否成功是一种相当糟糕的做法。

如果你使用PDO而不是mysqli,你的代码会容易得多,但如果你愿意使用mysqli,那么做这种事情的正确代码应该是:

<?php
$mysql_host = 'localhost';
$mysql_port = '';
$mysql_user = 'user';
$mysql_pass = 'password';
$mysql_mydb = 'rfidcards';
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_mydb);
$con->set_charset('utf8mb4'); // always set the charset
//$tagid = '39EAB06D';
$tagid = 'CCCCCCCC';
$query = "SELECT name, id  FROM rfidtags WHERE id = ?";
$stmt = $con->prepare($query);
$stmt->bind_param('s', $tagid);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($name, $id);
if ($stmt->fetch()) {
echo "$name $idn";
} else {
echo "failed to fetch datan";
}
这是错误的,因为mysqli::prepare((返回mysqli_stmt或false。一般来说,只有当您有错误的SQL查询时,它才会返回false。但是在您的情况下,即使您请求的id不在表中,您也有一个正确的SQL查询。因此,您需要在执行stmt之后检查结果,而不是在执行之前检查stmt。

最新更新