天天看點

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 (?, ?);'

}

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