PHP / mysqli:准备好的语句 num_rows 不断返回任何内容

PHP / mysqli: Prepared Statements with num_rows constantly returning nothing

在我的测试环境中有一个包含一些个人信息(姓名、电子邮件、地址等)的数据库。任何人都可以通过表格将这些信息插入到数据库中。在后台,它们在提交后通过参数化 INSERT 插入到数据库中。
我现在想做的是检测是否有人试图再次将相同的值插入数据库,如果他这样做了,则不插入新值而是显示错误消息。 (所以数据库中每个人的名字都是唯一的,没有多个行链接到一个名字)。
关于如何实现这一点,我有很多想法。我的第一个方法是使用 REPLACEINSERT IGNORE 之类的查询,但这种方法不会给我反馈,因此我可以显示错误消息。
我的第二次尝试是首先执行 SELECT 查询,检查该行是否已存在,如果 num_rows 大于 0,则 exit 显示错误消息(否则执行 INSERT-部分)。为此,我也必须对 SELECT 使用参数化查询,因为我将一些用户输入放入其中。考虑到参数化查询需要特殊函数来处理您通常可以用更少代码行完成的所有事情,我在互联网上研究了如何从我的 $statement 参数化语句对象中获取 num_rows。这就是我最后得到的:

$connection = new mysqli('x', 'x', 'x', 'x');
if (mysqli_connect_error()) {
    die("Connect Error");
}
$connection->set_charset("UTF-8");
$statement = $connection->stmt_init();
$statement = $connection->prepare('SELECT Name FROM test WHERE Name LIKE ?');
flags = "s";
$statement->bind_param($flags, $_POST["person_name"]);
$statement->execute();
$statement->store_result();
$result = $statement->get_result(); //Produces error
if ($result->num_rows >= 1) {
    $output = "Your already registered";
} else {
    $output = "Registering you...";
}
exit($output);

毕竟,我无法从我的陈述中明白为什么mysql我仍然不会给我num_rows。感谢任何帮助,提前致谢!
哦,如果你们能向我解释我必须做什么才能获得 affected_rows,那就太棒了!

编辑: 我知道我可以通过使用唯一约束来做到这一点。我还发现我可以查明 INSERT IGNORE 是否跳过了 INSERT。但这不会回答我的完整问题:为什么 SELECT num_rows 替代方案不起作用?

另一项编辑: 我将代码片段更改为现在的代码片段。虽然我的 mysql(i)-version 似乎是 5.6.33(我通过 $connection->server_info 回显了它)get_result() 产生了以下错误消息:
致命错误:在 X 行(get_result 行)

中调用未定义的方法 mysqli_stmt::get_result()

mysqli_num_rows() 的行为取决于使用的是缓冲的还是非缓冲的结果集。对于未缓冲的结果集,mysqli_num_rows() 将不会 return 正确的行数 直到检索到结果中的所有行。请注意,如果行数大于 PHP_INT_MAX,则该数字将 return 编辑为字符串。

还要确保先声明 ->store_result()。此外,该函数不适用于 LIMITSQL_CALC_FOUND_ROWS 一起使用。如果要获取找到的总行数,则必须手动执行。

编辑:

如果建议中的任何一项都不适合您,那么我建议重写您的 SQL 查询:

 SELECT `Name`, (SELECT COUNT(*) FROM `Persons`) AS `num_rows` FROM `Persons` WHERE `Name` LIKE ?

此查询将 return 来自您 Persons table 和 Name 的总数。