PHP/MYSQL-使用MYSQL\u insert\u id插入多行? 背景:
我正在将基本客户信息从客户表单上传到数据库。当客户单击“完成”时,输入的信息(姓名、城市、国家等)将存储在客户信息表中 作为替代方案,客户端还可以将图像上载到服务器。这些图像的信息(图像路径,图像名称)存储在另一个名为客户端图像的单独表中,该表有一个外键链接到客户端信息 客户信息表:PHP/MYSQL-使用MYSQL\u insert\u id插入多行? 背景:,php,mysql,Php,Mysql,我正在将基本客户信息从客户表单上传到数据库。当客户单击“完成”时,输入的信息(姓名、城市、国家等)将存储在客户信息表中 作为替代方案,客户端还可以将图像上载到服务器。这些图像的信息(图像路径,图像名称)存储在另一个名为客户端图像的单独表中,该表有一个外键链接到客户端信息 客户信息表: CREATE TABLE IF NOT EXISTS `client_info` ( `client_id` int(11) NOT NULL AUTO_INCREMENT, `client_name` v
CREATE TABLE IF NOT EXISTS `client_info` (
`client_id` int(11) NOT NULL AUTO_INCREMENT,
`client_name` varchar(100) NOT NULL,
`client_city` varchar(100) NOT NULL,
`client_country` varchar(10) NOT NULL,
PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10446 ;
CREATE TABLE IF NOT EXISTS `client_images` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_path` varchar(100) NOT NULL,
`image_name` varchar(100) NOT NULL,
`client_id` int(11) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=415;
function insert_images($directory_path, $image_name) {
global $connection;
$client_id=mysql_insert_id();
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
$result = mysql_query($query, $connection);
if ($result) {
// Success!
echo "<p></p>";
echo "Successfully uploaded the file.";
echo "<p></p>";
} else {
// Display error message.
echo "<p>" . mysql_error() ." : ".mysql_errno(). "</p>";
}
return $result;
}
客户端图像表:
CREATE TABLE IF NOT EXISTS `client_info` (
`client_id` int(11) NOT NULL AUTO_INCREMENT,
`client_name` varchar(100) NOT NULL,
`client_city` varchar(100) NOT NULL,
`client_country` varchar(10) NOT NULL,
PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10446 ;
CREATE TABLE IF NOT EXISTS `client_images` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_path` varchar(100) NOT NULL,
`image_name` varchar(100) NOT NULL,
`client_id` int(11) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=415;
function insert_images($directory_path, $image_name) {
global $connection;
$client_id=mysql_insert_id();
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
$result = mysql_query($query, $connection);
if ($result) {
// Success!
echo "<p></p>";
echo "Successfully uploaded the file.";
echo "<p></p>";
} else {
// Display error message.
echo "<p>" . mysql_error() ." : ".mysql_errno(). "</p>";
}
return $result;
}
问题: 我已成功地将一行上载到客户端图像表。添加多行会导致以下错误:
Cannot add or update a child row: a foreign key constraint fails (`db`.`client_images`, CONSTRAINT `client_images_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `client_info` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE) : 1452
然而,当我通过控制台添加多行和一个已经存在的客户机id来测试它时,它工作得非常好
例如:
mysql> INSERT INTO client_images (image_path, image_name, client_id) VALUES ('pathname1', 'name1', 10241);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO client_images (image_path, image_name, client_id) VALUES ('pathname2', 'name2', 10241);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO client_images (image_path, image_name, client_id) VALUES ('pathname3', 'name3', 10241);
Query OK, 1 row affected (0.00 sec)
我需要指出的是,我把它排成这样:
文件:(create_article.php)
插入客户信息($client\u name、$client\u city、$client\u country);
包括('uploads.php');
?>
在uploads.php内部,我有一个foreach循环,用于计算将要上载的文件数量,在循环结束时,我当前有一个函数insert\u images($image\u path,$image\u name)强>
功能(插入图像):
CREATE TABLE IF NOT EXISTS `client_info` (
`client_id` int(11) NOT NULL AUTO_INCREMENT,
`client_name` varchar(100) NOT NULL,
`client_city` varchar(100) NOT NULL,
`client_country` varchar(10) NOT NULL,
PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10446 ;
CREATE TABLE IF NOT EXISTS `client_images` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_path` varchar(100) NOT NULL,
`image_name` varchar(100) NOT NULL,
`client_id` int(11) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=415;
function insert_images($directory_path, $image_name) {
global $connection;
$client_id=mysql_insert_id();
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
$result = mysql_query($query, $connection);
if ($result) {
// Success!
echo "<p></p>";
echo "Successfully uploaded the file.";
echo "<p></p>";
} else {
// Display error message.
echo "<p>" . mysql_error() ." : ".mysql_errno(). "</p>";
}
return $result;
}
函数插入图像($directory\u path,$image\u name){
全球美元连接;
$client_id=mysql_insert_id();
$query=“插入到客户端图像中”(
映像路径、映像名称、客户端id
)价值观(
“{$directory\u path}”、“{$image\u name}”、“{$client\u id}”
)";
$result=mysql\u查询($query,$connection);
如果($结果){
//成功!
回声“”;
echo“已成功上载文件。”;
回声“”;
}否则{
//显示错误消息。
echo“”.mysql\u error()。:“.mysql\u errno()。””;
}
返回$result;
}
阅读其他类似的问题,我了解到致命弱点可能是mysql\u insert\u id(),并且不知何故它使用了另一个不同于foreach循环中第一个连接的连接,从而导致出现前面提到的mysql错误
谢谢
/
EDZ本部分:
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
将是:
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'$directory_path', '$image_name', $client_id
)";
必须使用转义变量以防止
另外,$client\u id
是数字,因此不需要引用'$client\u id'
此部分:
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
将是:
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'$directory_path', '$image_name', $client_id
)";
必须使用转义变量以防止
另外,$client\u id
是数字,因此不需要引用“$client\u id”
添加多行会导致以下错误:
最后一个插入id是当前MySQL会话中最近一次插入生成的id,该会话生成了一个自动递增的id
插入第一个图像时,最近插入的图像是客户端信息
但是,一旦到达第二个图像,最近的插入就是第一个图像的插入,因此mysql_INSERT_id()返回的值是不同的。同样,每个后续插入都会更改mysql\u INSERT\u id()返回的值
在foreach循环开始插入图像之前,应该设置变量$client_id,并将该变量传递给每个调用insert_images()。在uploads.php中:
$client_id=mysql_insert_id();
foreach (...) {
insert_images($client_id, ...);
}
将$client_id作为insert_images()函数的参数传递,而不是在函数中设置$client_id
function insert_images($client_id, $directory_path, $image_name) {
...
}
附言:@tttony提醒你要小心SQL注入,这一点很有道理 另请参阅我的演示文稿,或我书中有关SQL注入的章节 添加多行会导致以下错误: 最后一个插入id是当前MySQL会话中最近一次插入生成的id,该会话生成了一个自动递增的id 插入第一个图像时,最近插入的图像是客户端信息 但是,一旦到达第二个图像,最近的插入就是第一个图像的插入,因此mysql_INSERT_id()返回的值是不同的。同样,每个后续插入都会更改mysql\u INSERT\u id()返回的值 在foreach循环开始插入图像之前,应该设置变量$client_id,并将该变量传递给每个调用insert_images()。在uploads.php中:
$client_id=mysql_insert_id();
foreach (...) {
insert_images($client_id, ...);
}
将$client_id作为insert_images()函数的参数传递,而不是在函数中设置$client_id
function insert_images($client_id, $directory_path, $image_name) {
...
}
附言:@tttony提醒你要小心SQL注入,这一点很有道理
另请参阅我的演示文稿或我书中有关SQL注入的章节。是的,我知道这一点,这只是一个示例。不过还是要谢谢你。是的,我知道这一点,这只是一个例子。不过还是谢谢你。