Php/MySQL搜索功能:一定有更简单的方法来实现吗?

Php/MySQL搜索功能:一定有更简单的方法来实现吗?,php,mysql,performance,Php,Mysql,Performance,这将检查MySQL数据库,为表中创建的行创建自动名称。 这样很好,但我认为必须有一种更简单、更有效的方法来实现相同的产出 另外,我如何添加一个常量循环,使其始终创建一个no_name[XX]插入?您似乎在以迭代方式添加它们,所以。。。你不能这样做吗: $sql=mysql\u query(“SELECT*FROM”.TBL\u派系.”其中f_name='no_name'或f_name='no_name[02]'或f_name='no_name[03]'或f_name='no_name[04]'

这将检查MySQL数据库,为表中创建的行创建自动名称。 这样很好,但我认为必须有一种更简单、更有效的方法来实现相同的产出



另外,我如何添加一个常量循环,使其始终创建一个no_name[XX]插入?

您似乎在以迭代方式添加它们,所以。。。你不能这样做吗:

$sql=mysql\u query(“SELECT*FROM”.TBL\u派系.”其中f_name='no_name'或f_name='no_name[02]'或f_name='no_name[03]'或f_name='no_name[04]'或f_name='no_name[05]'或f_name='no_name[06]”

然后呢

$num_rows=mysql_num_rows(mysql_查询($sql))

然后:

另外,对于您正在询问的常量循环,您只需要执行与上面相同的操作,但不需要切换循环。。。有一段时间的循环。。。因此:

switch($num_rows){
    case 0:
    $auto_name = 'no_name';
    break;
    case 1:
    $auto_name = 'no_name[02]';
    break;
    case 2:
    $auto_name = 'no_name[03]';
    break;
    case 3:
    $auto_name = 'no_name[04]';
    break;
    case 4:
    $auto_name = 'no_name[05]';
    break;
    case 5:
    $auto_name = 'no_name[06]';
    break;
}
mysql_query("INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, 
f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer)
VALUES ('','$auto_name','0','$username','','','','','','gb','0','0','0','')");

使用循环。任何时候都有许多不同的事情都在做相同的事情,只是使用不同的索引,请使用循环。这样,您就不必在添加更多选项时添加更多代码

$result = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='no_name'");
$i = 0;
while(mysql_num_rows($result)){
    $i++;
    $result = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='no_name[".$i."]'");
}
// $i should be the next number to add now...
if($i > 0){
    $sql = "INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, 
f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer)
VALUES ('','no_name[$i]','0','$username','','','','','','gb','0','0','0','')";
}
else {
    $sql = "INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, 
f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer)
VALUES ('','no_name','0','$username','','','','','','gb','0','0','0','')";
}
$default\u names=5;//如果需要,动态设置此选项
$accepted=0;
$sql=mysql\u query(“SELECT*FROM”.TBL\u派系。“其中f\u name='no\u name'”);
$numrows=mysql\u num\u行($sql);
如果($numrows==0){
$auto_name='no_name';$accepted=1;
}
其他的
{
对于($i=0;$i<$default_name;$i++)
{
$sql=mysql\u query(“SELECT*FROM”.TBL\u派系.”其中f\u name='no\u name['0'.$i+2'.]'”;
$numrows=mysql\u num\u行($sql);
如果($numrows==0){
$auto_name=“no_name['0.$i+2.]”;
$accepted=1;
打破
}
}
}
mysql_查询(“插入到“.TBL_派系”。(f_id、f_名称、f_状态、f_老板、f_uboss、f_rhm、,
f_lhm、f_r1、f_r2、f_nat、f_基金、f_fmj、f_分数、f_页脚)
值(“'$auto_name'、'0'、'$username'、''、''、''、''、''、'gb'、'0'、'0'、'');

我看到的是,您希望找到可用的最大no\u名称,
如果是这样的话,可以在这个字段上做一个子字符串来找到这个最大值,然后插入到表
max+1

比如:

$default_names = 5; // set this dynamically if needed
$accepted = 0;
$sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='no_name'");
$numrows = mysql_num_rows($sql);
if($numrows == 0) { 
    $auto_name = 'no_name'; $accepted = 1;
}
else
{
  for ($i = 0; $i < $default_names ; $i++)
  {
     $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='no_name['0'.$i + 2.']'"); 
     $numrows = mysql_num_rows($sql); 
     if($numrows == 0) {
       $auto_name = "no_name['0'.$i + 2.']"; 
       $accepted = 1;
       break;
     }
  }
}
mysql_query("INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, 
f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer)
VALUES ('','$auto_name','0','$username','','','','','','gb','0','0','0','')");

首先,您可以删除接受的检查,方法是将其替换为用于设置值的反向检查,然后将sql语句中使用的值替换为
if($numrows==0)
中设置的变量

请记住,再次设置变量将覆盖它以前的值

另外,我在第一条语句周围加了一个
if(TRUE)
条件

SELECT 

 MAX(SUBSTRING_INDEX(SUBSTRING(f_name,8) , ']',1 ) ) AS max_id

 FROM ".TBL_FACTIONS."
现在您可能会注意到,除了
$auto_name='no_name'之外,每个块都有相同的代码行,仅在数字区域不同,第一个块始终运行,这使得它非常适合
do{}while()
循环

//lets get the auto name set
if (TRUE) {
  $auto_name = 'no_name';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql);
}

//default name 2
if ($numrows != 0) {
  $auto_name = 'no_name[02]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//default name 3
if ($numrows != 0) {
  $auto_name = 'no_name[03]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql);
}

//default name 4
if ($numrows != 0) {
  $auto_name = 'no_name[04]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//default name 5
if ($numrows != 0) {
  $auto_name = 'no_name[05]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//default name 6
if ($numrows != 0) {
  $auto_name = 'no_name[06]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//-->update faction table
mysql_query("INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer) VALUES ('','$auto_name','0','$username','','','','','','gb','0','0','0','')");
(请注意,这段代码有一点不同,它对条目0-9使用$noname[X],对条目10-99使用$noname[XX],对条目100-999使用$noname[XXX]等等,如果您希望这有所不同,您需要更改
$numeric_part='['.$i.]';
行)

这仍然不是很有效,因为这仍然会命中数据库5000次,只输入100个条目,总共500000(50万)次,输入1000(1K)个条目,最后一次查询命中数据库1000(1K)次

(您的主机/计算机将不喜欢此

一种更有效的继续方法是在末尾添加条目,并忽略中间的空条目(您现在正在重用这些条目)

忽略中间的空条目只需为
f_name
字段允许空条目,并将输出中的空条目替换为基于
f_id
字段的值即可


(我把最后一部分的编码留给你做练习。)

我已经尝试了你的答案,我得到了以下错误:解析错误:语法错误,意外的T_常量_ENCAPSED_字符串违规行:$auto_name='no_name[0'.$I+2'.]$自动_名称='无_名称[0'.$i+2'.]';->$自动名称='无名称[0'($i+2)。'];(括号应该可以解决错误)仍然得到:解析错误:语法错误,更改后意外的T_常量\u封装的\u字符串插入名称“no_name”,但如果该行存在,则不会插入另一行。从格式化代码开始,使其适合屏幕。@stereofrog:我需要生成它,因为,用户正在创建新行,我希望名称与上面的格式相同。而且,任何两个“派系”都不能有相同的名称@子母弹:编辑。看起来它不应该是
没有名字[02]
,而应该是
2
。其余在显示时间添加的不是PHP5特定的,请正确标记。当我尝试这段代码时,它只是一次又一次地插入“no_name”(每次提交)?对不起-代码中的输入错误。。。(我在查询中没有名字后没有输入[]s)另外-如果你想得到双重编号系统,你有[01][02][03]等等。。。然后您必须适当地设置$i的格式。:)我已重试,但如果没有\u名称,则该名称始终为no\u名称[0]。确定。。。发现了问题。。。如果没有“no_name”条目,那么它会添加“no_name[0]”,但仍然找不到“no_name”,因此。。。我已经编辑过了。。。看一看,然后再试一次。:)耶D它起作用了!现在来改变双倍数字的事情啊哈。我可能改天再加上那个改动。感谢您抽出时间,最重要的是,感谢您为我的问题提供了解决方案!您的解决方案比循环解决方案优雅得多,但有两个错误。1) 您应该包括WHERE语句,否则它还将计算非默认名称,如“somename3”。这在
中很容易做到,其中f_name(如“no_name%”)
2)您应该删除子字符串的第三个参数(1),否则您将无法获得任何带有数字>10@nico谢谢,大约1我同意,因为我写了一些类似BBE的东西,因为我不知道db中有什么,大约2不是一个错误,看看,只是
//lets get the auto name set
if (TRUE) {
  $auto_name = 'no_name';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql);
}

//default name 2
if ($numrows != 0) {
  $auto_name = 'no_name[02]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//default name 3
if ($numrows != 0) {
  $auto_name = 'no_name[03]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql);
}

//default name 4
if ($numrows != 0) {
  $auto_name = 'no_name[04]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//default name 5
if ($numrows != 0) {
  $auto_name = 'no_name[05]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//default name 6
if ($numrows != 0) {
  $auto_name = 'no_name[06]';
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql); 
}

//-->update faction table
mysql_query("INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer) VALUES ('','$auto_name','0','$username','','','','','','gb','0','0','0','')");
$numeric_part = ''; // numeric part is empty for the first time
$i = 1 // which name are we're checking

do {
  $auto_name = 'no_name'.$numeric_part;
  $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE f_name='".$auto_name."'");
  $numrows = mysql_num_rows($sql);

  //prepare for the next round trough the loop
  $i++;
  $numeric_part = '['.$i.']';
} while ($numrows != 0);

//-->update faction table
mysql_query("INSERT INTO ".TBL_FACTIONS." (f_id, f_name, f_status, f_boss, f_uboss, f_rhm, f_lhm, f_r1, f_r2, f_nat, f_funds, f_fmj, f_score,f_footer) VALUES ('','$auto_name','0','$username','','','','','','gb','0','0','0','')");