Mysqli准备插入嵌套选择在foreach中失败

时间:2015-05-16 10:43:35

标签: php mysql mysqli insert

我正在尝试向MySQL表插入一些日期,其中包含嵌套的3个嵌套选择的准备插入。问题是,对于所有嵌套选择,使用单个变量。实际SQL:

INSERT INTO db_test.offers
  (`id`,`catalog_service_id`,`offer_name`,
  `offer_description`,`offer_url`,
  `offer_interaction_format`,`offer_methods`)
VALUES(1,
(SELECT `catalog_service_id` FROM db_test.catalog_services
   WHERE `catalog_service_code` = ?),
(SELECT `catalog_service_name` FROM db_test.catalog_services
   WHERE `catalog_service_code` = ?),
(SELECT `catalog_service_name` FROM db_test.catalog_services
   WHERE `catalog_service_code` = ?),
'https://url.com', 'json', 'CC');

PHP代码:

class test extends mysqli{
function db_action($host = null){
    $mysqli = new mysqli($host, MYSQL_USER, MYSQL_PASS, "db_test");
    if(!$mysqli){
        die ("couldn't connect to mysql host" . mysqli_connect_error());
    }
$codes= ["AAAAA005760000000001","ААААА032680000000001","ААААА032680000000002"];
$query="SQL code from above";
$stmt = $mysqli->prepare($query);
    $stmt ->bind_param("sss", $offer, $offer, $offer);
    foreach ($codes as $k => $offer) {
        if($stmt->execute() === false){
            print 'Wrong SQL. Error: ' . $stmt->error . "\r\n";
        }else{
            $last_inserted_id = $mysqli->insert_id;
            print "Insert row with id: " . $last_inserted_id . " for service_code: ". $offer . "\r\n";
        }
    }
    $stmt->close();
    }
}

foreach的第一次迭代工作正常(插入一行有正确的数据),但是在第二和第三次(仅举例来说,$ codes数组中的实际元素数是未知的)。 sql-server上执行的语句是用问号而不是实际值执行的。当我在调试器中执行该函数时 - $ offer var的值会在每次迭代时发生变化。

来自服务器的SQL错误很明显:catalog_service_id不能为null。

表格信息:

CREATE TABLE `offers` (
      `offer_id` int(11) NOT NULL AUTO_INCREMENT,
      `id` int(11) NOT NULL,
      `catalog_service_id` int(11) NOT NULL,
      `offer_name` varchar(255) DEFAULT NULL,
      `offer_description` varchar(1000) DEFAULT NULL,
      `offer_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `offer_start_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
      `offer_stop_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
      `offer_url` varchar(256) NOT NULL,
      `offer_auth` enum('Basic','Digest') DEFAULT NULL,
      `offer_auth_name` varchar(255) DEFAULT NULL,
      `offer_auth_password` varchar(255) DEFAULT NULL,
      `offer_auth_secret` varchar(255) DEFAULT NULL,
      `offer_operator_id` int(11) NOT NULL,
      `public_offer_url` varchar(1000) NOT NULL,
      `offer_interaction_format` enum('urlencoded','json') NOT NULL DEFAULT 'urlencoded',
      `offer_methods` enum('CC','MC') NOT NULL DEFAULT 'MC',
      `offer_inn` varchar(20) DEFAULT NULL,
      `offer_kpp` varchar(20) DEFAULT NULL,
      `offer_min` int(11) DEFAULT NULL,
      `offer_max` int(11) DEFAULT NULL,
      PRIMARY KEY (`offer_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

我真的被卡住了......

0 个答案:

没有答案