Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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/MYSQL-使用MYSQL\u insert\u id插入多行? 背景:_Php_Mysql - Fatal编程技术网

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注入的章节。

是的,我知道这一点,这只是一个示例。不过还是要谢谢你。是的,我知道这一点,这只是一个例子。不过还是谢谢你。