teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

本文の修正

2017/11/17 07:58

投稿

red13
red13

スコア79

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,15 @@
1
+ ~~~ 経緯ここから ~~~
2
+ 最初の質問は
3
+ https://teratail.com/questions/93539
4
+ です。
5
+ Doctrineを使用していたのですが、あまりにもメモリを消費するのでpdoを使用し、$obj->getXX()を使用しないように修正しました。
6
+ pdo検索でメモリを消費しなくなりましたが、取得件数が数百万件になり、ループする回数を減らしたいため
7
+ https://teratail.com/questions/99914
8
+ の質問をしました。
9
+ 一度、数百万件で処理を実行したところ、問題なく出力できました。
10
+ しかし、ループでファイルに出力する処理で時間がかかりすぎるため、今回の質問をすることになりました。
11
+ ~~~ 経緯ここまで ~~~
12
+
1
13
  ```ここに言語を入力
2
14
  // ファイルの作成処理
3
15
  $outputFile = '/test/test.txt';

3

コードの修正

2017/11/17 07:58

投稿

red13
red13

スコア79

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,28 @@
1
1
  ```ここに言語を入力
2
+ // ファイルの作成処理
3
+ $outputFile = '/test/test.txt';
4
+ // 出力ファイルが既に存在する
5
+ if (file_exists($outputFile)) {
6
+ } else {
7
+ if (touch($outputFile)) {
8
+ // ファイル作成成功
9
+ if (chmod($outputFile, 0777)) {
10
+ // パーミッション変更成功
11
+ } else {
12
+ // パーミッション変更失敗
13
+ }
14
+ } else {
15
+ // ファイル作成失敗
16
+ }
17
+ }
18
+
19
+ // 以下の処理はパーミッション変更まで成功した前提で実行しています
20
+
2
21
  // $connはPDO接続情報
3
22
  // SELECTのSQL
4
23
  $sqlStr = "SELECT test_table.id id FROM test_table tt WHERE tt.note LIKE :test";
5
24
  // OUTFILEのSQL
6
- $outFileStr = " INTO OUTFILE '/test/test.txt'";
25
+ $outFileStr = " INTO OUTFILE ". $outputFile;
7
26
  // SQL作成
8
27
  $sqlStr .= $outFileStr;
9
28
 
@@ -16,6 +35,7 @@
16
35
  // SQL実行
17
36
  $stmt->execute($sqlStr);
18
37
  ```
38
+
19
39
  上記のSQLの結果をファイルに出力したいのですが、エラーが発生して出力できません。
20
40
  エラーメッセージは以下が出力されます。
21
41
 

2

コードの修正

2017/11/17 06:47

投稿

red13
red13

スコア79

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  ```ここに言語を入力
2
2
  // $connはPDO接続情報
3
3
  // SELECTのSQL
4
- $sqlStr = "SELECT test_table.id id FROM test_table tt WHERE tt.id = 1";
4
+ $sqlStr = "SELECT test_table.id id FROM test_table tt WHERE tt.note LIKE :test";
5
5
  // OUTFILEのSQL
6
6
  $outFileStr = " INTO OUTFILE '/test/test.txt'";
7
7
  // SQL作成
@@ -10,6 +10,9 @@
10
10
  // prepare
11
11
  $stmt = $conn->prepare($sqlStr);
12
12
 
13
+ // ※バインド
14
+ $stmt->bindValue(':test', '%test%', PDO::PARAM_STR);
15
+
13
16
  // SQL実行
14
17
  $stmt->execute($sqlStr);
15
18
  ```

1

補足の追加

2017/11/17 06:12

投稿

red13
red13

スコア79

title CHANGED
File without changes
body CHANGED
@@ -17,7 +17,7 @@
17
17
  エラーメッセージは以下が出力されます。
18
18
 
19
19
  【エラーメッセージ】
20
- SQLSTATE[28000]: Invalid authorization specification: 1045 Access denied for user 'user'@'123.456.789.000' (using password: YES)
20
+ SQLSTATE[28000]: Invalid authorization specification: 1045 Access denied for user 'user'@'123.456.789.111' (using password: YES)
21
21
 
22
22
  APサーバー:123.456.789.111
23
23
  DBサーバー:123.456.789.000
@@ -25,4 +25,7 @@
25
25
 
26
26
  上記のPHPを実行しているAPサーバーとDBサーバーが異なるため、
27
27
  DBサーバーの結果をAPサーバーに出力できないと思います。
28
- このような状態でSQLの結果をファイルに出力することは可能でしょうか?
28
+ このような状態でSQLの結果をファイルに出力することは可能でしょうか?
29
+
30
+ 補足:
31
+ 「INTO OUTFILE」が付与されていないときはエラーは発生しませんでした。