Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 Joomla将mysql表作为函数重新索引_Php_Mysql_Joomla_Joomla2.5 - Fatal编程技术网

Php Joomla将mysql表作为函数重新索引

Php Joomla将mysql表作为函数重新索引,php,mysql,joomla,joomla2.5,Php,Mysql,Joomla,Joomla2.5,我试图用php/joomla中的函数重新索引一个表。。。 它什么也不做。我也不能在一个字符串中生成整个slq命令集 function ReNumberID($TABLENAME ,$COLUMNNAME) { $sql = "set @a=0; " ; $db = JFactory::getDbo(); $query = $db->getQuery(true); $db->setQuery($sql); $db->execute(); $sql2 = "UPD

我试图用php/joomla中的函数重新索引一个表。。。 它什么也不做。我也不能在一个字符串中生成整个slq命令集

function ReNumberID($TABLENAME ,$COLUMNNAME) {
$sql = "set @a=0; " ;
$db = JFactory::getDbo();    

$query = $db->getQuery(true);   

$db->setQuery($sql);
$db->execute();
$sql2 = "UPDATE `".$TABLENAME."` SET `".$COLUMNNAME."`=(@a:=@a+1); " ;

$db->setQuery($sql2);
$db->execute();
$sql3 = "SELECT * FROM  `".$TABLENAME."` WHERE 1" ;

$db->setQuery($sql3);
$db->execute(); 
$newindexnumber = $db->getNumRows();
$newindexnumber++ ;
$sql4 = "ALTER TABLE `".$TABLENAME."` auto_increment = ".$newindexnumber." ;";

$db->setQuery($sql4);
$db->execute();
}

首先,我建议您检查每个查询是否成功,以及有多少行受到影响。您当前正在调用
execute()
,并相信确实发生了一些事情。谁知道你是不是把列名拼错了,还是有特权错误或其他什么

其次,您应该确保按照从当前低id号开始的顺序应用更新。因为你很容易出错。下面是一个例子:

mysql> create table bar (id int primary key, x int) engine=myisam;
mysql> insert into bar (id) values (1), (5), (7), (2);
mysql> select * from bar;
+----+------+
| id | x    |
+----+------+
|  1 | NULL |
|  5 | NULL |
|  7 | NULL |
|  2 | NULL |
+----+------+
mysql> set @a := 0;
mysql> update bar set id = (@a:=@a+1);
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
原因是ID1设置为1,然后ID5设置为2,这与第四行冲突

mysql> update bar set id = (@a:=@a+1) order by id;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from bar;
+----+------+
| id | x    |
+----+------+
|  1 | NULL |
|  3 | NULL |
|  4 | NULL |
|  2 | NULL |
+----+------+
这至少奏效了。如果我没有检查错误,我永远不会知道重复键错误

顺便说一下,您可以设置
altertable。。。AUTO_INCREMENT=0
,表格将自动将其调整为最大值(id)+1


但我更强烈的建议是:

不需要对自动递增键重新编号。主键必须是唯一的,但不要求是连续的

有间隙是正常的。当插入失败、删除行或插入后回滚时会发生这种情况

如果对整个表中的行主键重新编号,可能会出现问题。例如,如果您的应用程序在数据库外部进行通信,则外部系统可能会通过旧id记录实体

示例:虐待用户1234骚扰其他用户,并将自己禁止,关闭并删除其帐户。然后将所有id重新编号,并将1234分配给另一个新用户。第二天,一位律师出现在你面前,向你提出对用户1234的民事诉讼。可怜的新用户因为别人做的事而受到指责


我在书中写到了这一点。有关此错误的章节称为“伪密钥整洁怪胎”。

如果您将所有内容重新编号为下一个值,则可能会遇到连续编号的行,其中第一个行的重新编号将与第二个行冲突,并且查询可能会中止。您需要在现有范围外重新编号,然后在所需范围内重新编号。但是,我必须问:为什么?我特别建议您不要在想要
loadResults()
时调用
execute()
。我还将使用Joomla JDatabaseQuery api。