Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 使用pdo将大型json数组插入到表中--&燃气轮机;永远_Php_Mysql_Arrays_Json_Pdo - Fatal编程技术网

Php 使用pdo将大型json数组插入到表中--&燃气轮机;永远

Php 使用pdo将大型json数组插入到表中--&燃气轮机;永远,php,mysql,arrays,json,pdo,Php,Mysql,Arrays,Json,Pdo,我有一个巨大的json数组。json数组的某些元素本身就是序列化的json数组。问题是,我要使用这个大型json数组进行大量的表插入。我也在使用pdo 如何使用pdo快速地将这个json数组(它本身已经序列化了json数组)转换为表插入 这似乎花费了太多的时间,而且似乎不是一种干净的做事方式 基本上,我有一个使用json数组插入表的接口,我需要使用pdo的列和占位符将其转换为表插入。数组中的元素太多,无法插入 我尝试使用这段代码自动创建插入,效果很好,我喜欢它的表现方式,但我不能使用这段代码,也

我有一个巨大的json数组。json数组的某些元素本身就是序列化的json数组。问题是,我要使用这个大型json数组进行大量的表插入。我也在使用
pdo

如何使用
pdo
快速地将这个json数组(它本身已经序列化了json数组)转换为表插入

这似乎花费了太多的时间,而且似乎不是一种干净的做事方式

基本上,我有一个使用json数组插入表的接口,我需要使用pdo的列和占位符将其转换为表插入。数组中的元素太多,无法插入

我尝试使用这段代码自动创建插入,效果很好,我喜欢它的表现方式,但我不能使用这段代码,也不能使用json数组自动创建插入,因为json数组的元素本身已经序列化了json数组

function create_query( $table_name, $cols, $placeholders )
{

    $query= "INSERT INTO $table_name ( 
                                          $cols
                                       )
             VALUES                    (
                                          $placeholders
                                       )";
}

/*
    arg1= table_name;

*/
function insert_into_table(  $argums, $location )
{

    $num_classes= $location[ "num_classes" ];


    foreach( $location as $key => $value )
    {
        $$key= $value;
    }

    $keys= array_keys( $argums );

    $table_name     = $keys[ 0 ];

    array_shift( $keys );
    array_shift( $argums );
    $cols= implode( ", ", $keys );


    $bound_array= array();

    echo var_dump( $keys );

    foreach( $keys as &$value )
    {
        $bound_array[ $value ]= ${ $argums[ $value ] };
        $value= ":".$value;
    }

    $placeholders= implode( ", ", $keys );

    $query= create_query( $table_name, $cols, $placeholders );

    return array( "query" => $query, "bind" => $bound_array );

}

function do_insert( $arr )
{
    global $db;

    echo var_dump( $arr );
    $query= $arr[ "query" ];
    $bind=  $arr[ "bind"  ];

    $stmt= $db->prepare( $query );
    echo var_dump( $stmt );

    if( !$stmt->execute( $bind ) )
    {
        echo var_dump( $stmt->errorInfo() );
    }

    $affected_rows= $stmt->rowCount();
}

    $assoc_arr= insert_into_table( array( "company" => "company", 'companyName'=> "companyName", 'pkid' => 'pkid', 'reminderEmailTop' => 'reminderEmailTop', 'reminderEmailBottom' => 'reminderEmailBottom', 'reminderLink' => 'reminderLink' ), $location );

    do_insert( $assoc_arr );

    $assoc_arr= insert_into_table( array( "companyNav" => "companyNav", "companyId" => "pkid", 'type'=> "basiclife_type", "page_nav" => "basiclife_pagenav", "orderby" => "basiclife_orderby" ), $location );

    do_insert( $assoc_arr );

    $assoc_arr= insert_into_table( array( "companyNav" => "companyNav", "companyId" => "pkid", 'type'=> "bene_type", "page_nav" => "bene_pagenav", "orderby" => "bene_orderby" ), $location );

    do_insert( $assoc_arr );

    $assoc_arr= insert_into_table( array( "companyNav" => "companyNav", "companyId" => "pkid", 'type'=> "beneper_type", "page_nav" => "beneper_pagenav", "orderby" => "beneper_orderby" ), $location );

    do_insert( $assoc_arr );

    $assoc_arr= insert_into_table( array( "companyNav" => "companyNav", "companyId" => "pkid", 'type'=> "dent_type", "page_nav" => "dent_pagenav", "orderby" => "dent_orderby" ), $location );

    do_insert( $assoc_arr );

    $assoc_arr= insert_into_table( array( "companyNav" => "companyNav", "companyId" => "pkid", 'type'=> "eflex_type", "page_nav" => "eflex_pagenav", "orderby" => "eflex_orderby" ), $location );

    do_insert( $assoc_arr );

    $assoc_arr= insert_into_table( array( "companyNav" => "companyNav", "companyId" => "pkid", 'type'=> "hsa_type", "page_nav" => "hsa_pagenav", "orderby" => "hsa_orderby" ), $location );

    do_insert( $assoc_arr );
..以及大约50多个此类插入件

但是,对于包含json数组元素的插入,我无法使用上述代码


所以我创建了一个函数,它只是一个手动输入的insert…

这是一个原型。只需向它提供一个数据数组、csv或json文件,它就会遍历所有数据条目。根据需要添加风味: 类MySql { private$sDbName='play'; private$sUsername='root'; 私人$sPassword=''; private$sHost='localhost'; private$oConnection=null

    public function __construct()
    {
        $this->oConnection = new PDO( 
            'mysql:host=' 
            . $this->sHost 
            . ';dbname=' 
            . $this->sDbName, 
            $this->sUsername, 
            $this->sPassword 
            );
    }
    public function getDb()
    {
        return $this->oConnection;
    }

    public function bindVariables( &$oStmp, $aBinds )
    {
        foreach( $aBinds as $sVariable => $vValue )
        {
            // Ensure we have a colon prepended for PDO.
            if( substr( $sVariable, 0, 1 ) !== ':' )
            {
                $sVariable = ':' . $sVariable;
            }
            $oStmp->bindValue( $sVariable, $vValue );
        }
    }
}
$oMySql = new MySql;
$oDb = $oMySql->getDb();

// $sCsvExampleLine = '1,2,3,4,5';
$aCsv = file( 'infile6.csv' );
$iCountlines = count( $aCsv );
for( $j = 0; $j < $iCountlines; ++$j )
{
    $aRaw = explode( ',', $aCsv[ $j ] );
    $aData[ $j ][ 'companyNav' ] = $aRaw[ 0 ];
    $aData[ $j ][ 'companyId' ]  = $aRaw[ 1 ];
    $aData[ $j ][ 'type' ]       = $aRaw[ 2 ];
    $aData[ $j ][ 'page_nav' ]   = $aRaw[ 3 ];
    $aData[ $j ][ 'orderby' ]    = $aRaw[ 4 ];
}

// $aData[] = array( 'companyNav' => '1', 'companyId' => '2', 'type'=> '3', 'page_nav' => '4', 'orderby' => '5' );

// Create the sql outside of the loop.
$sSql = "
    INSERT INTO `1` 
    ( companyNav, companyId, type, page_nav, orderby )
    VALUES 
    ( :companyNav, :companyId, :type, :page_nav, :orderby )
    ";
$oStmp      = $oDb->prepare( $sSql );
$iCountData = count( $aData );
for( $k = 0; $k < $iCountData; ++$k )
{
    $oMySql->bindVariables( $oStmp, $aData[ $k ] );
    $oStmp->execute();
    // var_dump( $oStmp->rowCount() );
}
$oErrors = $oStmp->errorInfo();
var_dump( $oErrors );
public function\uuuu construct()
{
$this->oConnection=新PDO(
'mysql:host='1!'
.$this->sHost
“;dbname=”
.$this->sDbName,
$this->sUsername,
$this->sPassword
);
}
公共函数getDb()
{
返回$this->o连接;
}
公共函数bindVariables(&$oStmp,$aBinds)
{
foreach($aBinds作为$sVariable=>$vValue)
{
//确保我们为PDO准备了一个冒号。
if(substr($s变量,0,1)!=':')
{
$s可变=':'。$s可变;
}
$oStmp->bindValue($sVariable,$vValue);
}
}
}
$MySql=newmysql;
$oDb=$mySQL->getDb();
//$sCsvExampleLine='1,2,3,4,5';
$aCsv=文件('infile6.csv');
$iCountlines=计数($aCsv);
对于($j=0;$j<$iCountlines;++$j)
{
$aRaw=爆炸(',',$aCsv[$j]);
$aData[$j]['companyNav']=$aRaw[0];
$aData[$j]['companyId']=$aRaw[1];
$aData[$j]['type']=$aRaw[2];
$aData[$j]['page_nav']=$aRaw[3];
$aData[$j]['orderby']=$aRaw[4];
}
//$aData[]=数组('companyNav'=>'1','companyId'=>'2','type'=>'3','page\u nav'=>'4','orderby'=>'5');
//在循环外部创建sql。
$sSql=”
插入到'1'中
(公司名称、公司ID、类型、页面导航、订购人)
价值观
(:companyNav,:companyId,:type,:page\u nav,:orderby)
";
$oStmp=$oDb->prepare($sSql);
$iCountData=计数($aData);
对于($k=0;$k<$iCountData;++$k)
{
$mysql->bindVariables($oStmp,$aData[$k]);
$oStmp->execute();
//变量转储($oStmp->rowCount());
}
$oErrors=$oStmp->errorInfo();
var_转储(错误金额);
可以利用绑定使用相同的sql插入不同的数据。 上面的查询允许您在类中包装数据库连接以方便使用,并避免使用全局变量

O/p主要关注的是复制插入的艰巨任务。如果可以从外部源中以正确的顺序/格式提取数据或按需生成数据,那么任务的开销就会减少

只要格式保持不变,就可以继续从各种来源向$aData追加,并根据需要插入


通过实现多个绑定,可以进一步改进以下内容,但这稍微超出了问题的范围,即使效率更高。

您可能会逐个插入,而不是一次性插入。要么将查询重构为多个插入,如果出现瓶颈,还应该添加分块。如果您发布了一个代码示例,我会看一看。对不起,我说的“永远”是指手动键入sql插入需要永远的时间,而不是代码执行时间太长。问题是将json数据映射到表列的值完全正确。添加了一些关于为什么要这样做与为什么要做其他事情的评论。多重绑定将提高效率。