php pdo 打印sql语句,php – 使用PDO准备SQL语句

我的代码看起来像这样:

// Connect to SQLite DB

DB('/path/to/sqlite.db');

DB('BEGIN TRANSACTION;');

// These loops are just examples.

for ($i = 1; $i <= 10000; $i++)

{

for ($j = 1; $j <= 100; $j++)

{

DB('INSERT INTO "test" ("id", "name") VALUES (?, ?);', $i, 'Testing ' . $j);

}

}

DB('END TRANSACTION;');

这是DB()函数:

function DB($query)

{

static $db = null;

if (is_file($query) === true)

{

$db = new PDO('sqlite:' . $query, null, null, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

}

else if (is_a($db, 'PDO') === true)

{

$result = $db->prepare($query);

if (is_a($result, 'PDOStatement') === true)

{

if ($result->execute(array_slice(func_get_args(), 1)) === true)

{

if (stripos($query, 'INSERT') === 0)

{

return $db->lastInsertId();

}

if (stripos($query, 'SELECT') === 0)

{

return $result->fetchAll(PDO::FETCH_ASSOC);

}

return $result->rowCount();

}

}

return false;

}

return true;

}

问题是内部循环中的DB()调用需要很长时间才能完成,我认为做这样的事情会大大加快执行速度:

DB('BEGIN TRANSACTION;');

for ($i = 1; $i <= 10000; $i++)

{

$queries = array();

for ($j = 1; $j <= 100; $j++)

{

$queries[] = 'INSERT INTO "test" ("id", "name") VALUES (?, ?);' /*, $i, 'Testing ' . $j;*/

}

DB(implode("\n", $queries));

}

DB('END TRANSACTION;');

问题是我不知道如何使用相应的变量准备(替换和转义)所有问号,有什么方法可以实现这一点吗?

解决方法:

如果要将大量数据插入表中,请尝试在一个查询中插入数据.

$query = 'INSERT INTO "test" ("id", "name") VALUES ';

$data = array();

for ($i = 1; $i <= 10000; $i++) {

for ($j = 1; $j <= 100; $j++) {

$query .= '(?,?),';

$data[] = $i;

$data[] = 'Testing '.$j;

}

}

$query = substr($query, 0, -1);

DB($query, $data);

这应该消除单插入查询的开销.

但是查询长度有一个限制,如果您遇到查询长度问题,请尝试在for循环中更频繁地发出DB()调用.

标签:php,sqlite,database,pdo

来源: https://codeday.me/bug/20191008/1875346.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值