Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何根据查询结果循环我的函数_Php_Mysql - Fatal编程技术网

Php 如何根据查询结果循环我的函数

Php 如何根据查询结果循环我的函数,php,mysql,Php,Mysql,我编写了一个函数,它生成一个随机idmakeid()为了确保id是唯一的,我有一个SQL语句来检查id是否已经存在 $does_id_exist = mysql_query("SELECT COUNT(*) AS count FROM signups WHERE affid='$affid'"); if(mysql_num_rows($does_id_exist) == 1) { #loop function and perform query again } else {

我编写了一个函数,它生成一个随机id
makeid()为了确保id是唯一的,我有一个SQL语句来检查id是否已经存在

$does_id_exist = mysql_query("SELECT COUNT(*) AS count FROM signups WHERE affid='$affid'");
if(mysql_num_rows($does_id_exist) == 1) 
  { 
  #loop function and perform query again
  }
else
  {
  #insert record
  }
所以我在循环函数时遇到了麻烦。如何循环函数
makeid()
并执行
$does\u id\u exist
检查以确保每个
id
都是唯一的


--更新——只是为了澄清一下——我的代码生成了一个类似
YES@281E
但在我将此id插入用户记录之前。我只需要验证是否有任何其他用户已经拥有此id。如果其他用户拥有此id,则事件必须触发我的函数以创建新id,例如
WOW!29E3
然后再次检查sql/查询以确保没有其他用户具有该id。如果失败,则继续循环,如果id可用,则结束并插入。

您可以在数据库表上使用主键,或者类似以下操作:

<?php
    // the id to insert
    $newId = null;

    // populate with results from a SELECT `aff_id` FROM `table`
    $currentIds = array(); 

    // prepopulate
    for( $i=0; $i<100000; $i++ )
    {
        $currentIds[] = "STRING_" + rand();
    }

    // generate at least one id
    do
    {
        $newId = "STRING_" + rand();
    }
    // while the id is taken (cached in $currentIds)
    while( in_array($newId, $currentIds) );

    // when we get here, we have an id that's not taken.
    echo $newId;    
?>
不要进行
计数(*)
,因为您不需要知道有多少行(它应该是0或1,因为您需要Id唯一),所以即使DB找到您的行,它仍将检查整个表是否计数。您真的很关心是否有1行,所以只需选择具有该ID的行,这就足够了。您还应该避免使用
rand()
——正如您所看到的,这并没有帮助,您无法预测在找到“空闲槽”之前可以执行多少循环。使用一些可预测的内容,例如日期前缀,或每天递增的前缀。任何有助于缩小数据集范围的内容。但现在(伪代码!):

确保数据库已建立索引,以加快速度


编辑:我同意任何缓存都有助于加快速度(您可以根据@Josh示例轻松添加它),不过,我认为这是在错误的地方修复的。如果可能的话,重新考虑生成ID的方式。它实际上不需要是自动递增的,但是比
rand()
更可预测的方法会对您有所帮助。如果你的身份证不需要很容易记住,而且不需要考虑安全问题,可以使用10以外的数字(也就是说,使用26将使用所有数字+字母,因此您将以
前缀-AX3TK
结尾,并根据需要使用字符串,同时您可以轻松快速生成下一个Id

您可以始终使用自动递增的Id字段并完全回避此问题。不,我不能,因为这会生成类似于附属Id的内容。它不是iNT——它是一个单词+一些随机数和+一个符号。你应该使用逃逸SQL来避免严重的SQL注入错误。如果你正在开发一个新的应用程序,请不要使用
mysql\u query
,因为它过时且危险。
mysqli
和PDO更安全,更易于正确使用。@tadman我知道这不是生产代码。个人测试,我正在切换到prepared statement
PDO
tyGood to Head。这种查询具有放射性危险,应该尽快关闭。我想有一种讽刺意味,你的用户名的人可能会有SQL注入错误的代码。这对我不起作用。我的代码使一个id像YES@281E但在我将此id插入用户记录之前,我只需要验证是否有任何其他用户已经具有此id。如果其他用户具有此id,则该事件必须触发我的函数以创建新id WOW!29E3,然后再次检查查询以确保没有其他用户具有此id。如果失败,则继续循环,如果失败,则结束并插入id可用。@FA''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
在您执行最后一次插入之前,以防其他人已经创建了ID,但它没有缓存到
$currentIds
中。我喜欢缓存校对的计数-但我不能将所有ID作为一个没有意义的数组来提取。有40000多个ID-我需要在插入和插入之前验证我刚刚生成的ID是否唯一如你所说,将其计算到缓存证据中。你能修改你的答案吗?@FA'''''''''''''''''''''''''''''':我已经更新了我的示例,用十万个随机ID填充一个数组。整个过程只需不到一秒钟(包括随机传播)。除非您的ID是1000个字符长,否则这不重要。嘿,这很酷--您是如何获得运行时的..?ID不是一个非常有效的建议。他应该将获取的ID预缓存在数组中,就像我的示例所做的那样,如果他的站点的容量足够大,可以生成并发ID,那么从表WH中进行最后一次选择ERE ID=$NEW。这样,每次冲突只需要1-2次查询,而不是
N
。当然,“缓存”在阵法中不会受伤。谢谢-1。很好childish@FA我是在找乔希,不是你。不,我在这个问题上没有投任何反对票,所以你没有被我打中。我在试着用你的例子。我觉得它更合适。如果我能让它起作用,我会投票并检查你的答案。Thx
$id = null;
while( $id == null ) {
  $newId = 'prefix' . rand();

  mysql_query("SELECT `affid` FROM `signups` WHERE `affid`='${newId}'");
  if( mysql_num_rows() == 0) {
    $id = newId;
    break;
  } 
}