0

在我的测试环境中,有一个包含某些人员信息(名称,电子邮件,地址等)的数据库。这些信息可以被任何人通过表单插入到数据库中。在提交后,它们在后台插入参数化的INSERT到数据库中。
我现在想要做的是检测是否有人试图再次将相同的值插入到数据库中,如果他这样做,则不插入新值,而是显示错误消息。 (因此数据库中的每个人名都是唯一的,没有多个行链接到一个名称)。
我对如何实现这一目标有许多想法。我的第一个是使用REPLACEINSERT IGNORE这样的查询,但这种方法不会给我反馈,所以我可以显示错误消息。
我的第二次尝试是首先做一个SELECT查询,检查该行是否已经存在,并且如果num_rows大于0,exit带有错误消息(并且执行INSERT-部分)。为了这个工作,我将不得不使用SELECT的参数化查询,因为我将一些用户输入放入它中。确定参数化查询需要使用少量代码行才能完成的所有功能,我在互联网上研究如何从我的$ statement参数化语句对象中获取num_rows。这是我不得不在最后:PHP/mysqli:使用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); 

毕竟,我不能明白为什么mysqli的仍不需额外给我num_rows从我的发言。任何帮助表示感谢,提前致谢!
哦,如果你们可以向我解释我必须做些什么才能得到affected_rows,那真是太棒了!

编辑:我知道我可以通过使用独特的约束。我还发现,我可以看看INSERT IGNORE是否跳过INSERT。但是这不会回答我的完整问题:为什么SELECT num_rows替代方案不起作用?

其他编辑:我将代码片段更改为我现在拥有的代码片段。虽然我的MySQL(I) - 版本似乎是33年6月5日 get_result(我通过$connection->server_info回显吧)()产生以下错误消息:
致命错误:调用未定义的方法mysqli_stmt :: get_result()在X行(行get_result

+1

对您要保护的数据库列的UNIQUE约束如何? –

+0

@Kevin_Kinsey为什么上面的num_rows无法正常工作?对于未来的项目来说,知道如何使用参数化的mysqli语句和查询获取num_rows和affected_rows会很有用。还是)感谢你的建议! – SearchingSolutions

+0

尝试使用'execute()'而不是'fetch()' – Machavity

回答

0

mysqli_num_rows()的行为取决于是否正在使用缓冲或无缓冲的结果集。对于未缓冲的结果集,mysqli_num_rows()将不会返回正确的行数,直到检索到结果中的所有行。请注意,如果行数大于PHP_INT_MAX,则该数字将作为字符串返回。

另外请确保您首先声明->store_result()。此外,该功能不适用于与SQL_CALC_FOUND_ROWS联合使用的LIMIT。如果你想获得找到的总行数,你必须手动完成。

编辑:

如果从建议中没有不为你工作,那么我建议重写你的SQL查询:

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

此查询将从您Persons返回总数表以及Name,如果存在。

+0

我没有处理很多条目,所以'PHP_INT_MAX'对我来说不是问题。我正在声明'store_result()',如上例所示。我不能使用'get_result()',因为它看起来像我的浏览器不支持它。我怎样才能获取'num_rows()'呢? – SearchingSolutions

+0

这个查询每次返回num_rows为1,即使当这个值还不存在时... :( – SearchingSolutions

+0

请再次看到编辑。 – bodi0

相关问题