使用PHP end()函数分配新id
我有一个数据库问题表。我使用整数变量Id对表中的所有元素进行排序 我想要什么? 无论何时,都会添加一个新问题。它被分配了一个新的id,比我数据库中最后一个问题的id大1倍 以下是我的工作:使用PHP end()函数分配新id,php,mysql,pdo,Php,Mysql,Pdo,我有一个数据库问题表。我使用整数变量Id对表中的所有元素进行排序 我想要什么? 无论何时,都会添加一个新问题。它被分配了一个新的id,比我数据库中最后一个问题的id大1倍 以下是我的工作: include('dbconnect.php'); $ids = $connection->prepare('SELECT * FROM question ORDER BY id ASC'); $ids->execute(array()); $result = $id
include('dbconnect.php');
$ids = $connection->prepare('SELECT * FROM question ORDER BY id ASC');
$ids->execute(array());
$result = $ids->fetchAll(PDO::FETCH_ASSOC);
$new_id = end($result['id']); //Error in this line.
$new_id = $new_id + 1;
但是,我总是犯错误
Warning: end() expects parameter 1 to be array, null given in /Applications/MAMP/htdocs/question/submit.php on line 20
我使用的是FetchAll
语句,因此我觉得应该返回一个数组。谁能找出错误在哪里
添加到数据库中的每个新问题的ID为1。如下所述:
AUTO_INCREMENT
属性可用于为新行生成唯一标识:
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
SELECT * FROM animals;
创建餐桌动物(
id MEDIUMINT NOT NULL自动增量,
名称字符(30)不为空,
主键(id)
);
插入到动物(名称)值中
狗、猫、企鹅、,
('lax')、('whale')、('鸵鸟');
从动物中选择*;
返回:
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+----+---------+
+----+---------+
|id |名称|
+----+---------+
|1 |狗|
|2 |猫|
|3 |企鹅|
|4 |松懈|
|5 |鲸鱼|
|6 |鸵鸟|
+----+---------+
没有为AUTO_INCREMENT
列指定值,因此MySQL会自动分配序列号。您还可以显式地将NULL
或0分配给列以生成序列号
为什么不在数据库中使用自动增量呢?如果您不能轻松修改sql模式,您也可以执行
从问题中选择MAX(id)+1作为新的\u id。您当前的问题是end($array)
提供了数组的最后一个元素,而实际提供的NULL($result['id'])不存在)。您可以使用end($result)['id']
来代替(>=PHP5.4)@Ninsuo如果我使用end($result)['id']
,分号放在哪里。因为如果我执行end($result)['id']
或end($result),它将不起作用;['id']
。请给我一个使用上述风格的end函数的echo语句。没关系,算出了。首先,我需要将数组返回到一些变量中,比如$list=end($result)
,然后使用$list['id']
。这很有魅力。谢谢你的帮助。我强烈反对@Ninsuo的方法:它不是线程安全的。如果同时插入两个问题(可能是由不同的用户提出的),则可能会出现竞争风险,即两个会话都会为各自的新问题派生相同的id。使用表锁是执行此操作的唯一安全方法,例如MySQL在后台使用自动增量
。