質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

3回答

183閲覧

csvをインポートして、そのデータをupdateする方法について(2)

alkeran

総合スコア29

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/06/18 02:06

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in ...

以下のPHPコードを実行すると上記のエラーが出ました。2番目の引数が変数ではないということでしょうか?あと、ブラウザに以下が表示されましたが、データベースの価格は更新されませんでした。 csvには16行のcodeに対するpriceがあります。どなたかご教授宜しくお願い致します。

update tb_name set price=COALESCE(ELT(FIELD(code,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?),price)Array ( [0] => iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii [1] => 1234565789 [2] => 987654321 [3] => 2468101214 [4] =>135791113...[16] => 999999999 //←ここまでcodeの配列//
//ここからpriceの配列//
[17] => 7,596 [18] => 1,430 [19] => 7,150 [20] => 2,520 [21] => 1,220 [22] => 6,100 [23] => 6,100 [24] => 1,660 [25] => 8,300 [26] => 4,530 [27] => 22,650 [28] => 22,650 [29] => 4,840 [30] => 7,930 [31] => 5,020 [32] => 25,100 )

code($row[0]) price($row[5]) 1234565789 7,596 987654321 1,430 2468101214 7,150 135791113 2,520 . . .

PHP

1<?php 2// mysqliクラスのオブジェクトを作成 3$mysqli = new mysqli('xxx', 'xxx', 'xxx', 'xxx'); 4if ($mysqli->connect_error) { 5 echo $mysqli->connect_error; 6 exit(); 7} else { 8 $mysqli->set_charset("utf8"); 9} 10 11$id=[]; 12$val=[]; 13if (($fp = fopen("xxx.csv", "r")) !== FALSE) { 14 while (($row = fgetcsv($fp, 1000, ",")) !== FALSE) { 15 $id[]=$row[0]; 16 $val[]=$row[5]; 17 } 18 fclose($fp); 19} 20$prepare_param=implode(",",array_fill(0,count($id),"?")); 21$sql ="update tb_name set price=COALESCE(ELT("; 22$sql.="FIELD(code,".$prepare_param.")"; 23$sql.=",".$prepare_param."),price)"; 24print $sql; 25 26$params=[str_repeat( 'i', count($id)*2)]; 27$params=array_merge($params,$id,$val); 28print_r($params); 29 30$stmt = $mysqli->prepare($sql); 31call_user_func_array([$stmt,"bind_param"], $params); 32$stmt->execute(); 33?> 34

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

9.00E+11

これは数値表現第 3 形式 (NR3)といって、9.00*10の11乗という意味です。
http://kikakurui.com/x0/X0210-1986-01.html

投稿2017/06/20 00:24

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alkeran

2017/06/21 05:15

なるほど。9.00E+11は単純に数字の羅列なのですね。 1124028E1030などのアルファベットの入った文字列は更新されないということは、数列しか反応しないのでしょうか?
alkeran

2017/06/21 05:17

試しに、Eを抜いて11240281030で以下のコードを実行したらpriceが7596に更新されました。 `price`=COALESCE(ELT(FIELD(`code`,11240281030),7596),`price`)';
yambejp

2017/06/21 05:31

ちょっと微妙ですね プレースホルダーの場合int型(mysqliで渡す最初のパラメータ「i」)を指定して データ渡しをするのにE+n型で渡すと数値として認識できないかもしれません。 $val[]=str_replae(",","",$row[5]); とカンマをとる方法を提示しましたがその部分に対して数値化してみとよいかもしれません $val[]=str_replae(",","",$row[5])+0;
alkeran

2017/06/21 05:47

$val[]=str_replae(",","",$row[5])+0; 実行しましたが、priceは更新されませんでした。 codeのアルファベットを抜いた数字の羅列だと更新したため、それで試してみたいと思います。
yambejp

2017/06/21 05:55

もうすこし真面目にやるなら $val[]=strval(str_replae(",","",$row[5]))+0; とします。 また、極端に数値が大きい可能性があるなら $params=[str_repeat( 'i', count($id)*2)]; の箇所は、intをやめてdoubleにしたほうがいいかもしれません $params=[str_repeat( 'd', count($id)*2)];
alkeran

2017/06/21 06:04

ありがとうございます。 codeは12ケタです。
yambejp

2017/06/21 06:17

int型の上限は2147483647です。正の整数のみにしぼっても int unsignedで4294967295までしか入りません。 カラムの型は大丈夫でしょうか? やるならbigint型にするか、doubleにするかですね $paramsにしても「d」をベースに考えたほうがよさそうです
alkeran

2017/06/23 13:06

全てのcode(例:1124028E1030)はアルファベットも含めた12ケタです。 数列ではないため COALESCE(ELT(FIELD を使えないんでしょうか。
yambejp

2017/06/23 13:15 編集

> アルファベットも含めた12ケタ であれば、型にstringを指示してください $params=[str_repeat( 'i', count($id)*2)]; を以下に変更してください $params=[str_repeat( 's', count($id)).str_repeat( 'd', count($price))]; ※idはstring、priceはdouble
alkeran

2017/06/24 12:14

$params=[str_repeat( 's', count($id)).str_repeat( 'd', count($price))]; これでも更新されませんでした。
alkeran

2017/06/24 12:21

いつも通り、以下のエラーが出ました。 Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in xxx
yambejp

2017/06/26 04:24

mysqliだと埒が明かないようなので、PDOの環境を整えませんか? 準備できたら再度質問してみて下さい
alkeran

2017/06/27 13:04

はい。頑張ってみたいと思います。
guest

0

パラメータの数や書式には間違いがないようなんですが

ちょっと関係ないところで修正が必要なかしょ

$val[]=$row[5];

カンマ入りの数値になっているようなのでカンマをとってください

PHP

1$val[]=str_replae(",","",$row[5]);

パラメータのint型渡しもstringにしてみます?

$params=[str_repeat( 'i', count($id)*2)];

PHP

1$params=[str_repeat( 's', count($id)*2)]; 2

投稿2017/06/19 04:03

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alkeran

2017/06/19 11:58

返答ありがとうございます。 $val[]=str_replae(",","",$row[5]); は $val[]=str_replace(",","",$row[5]); でしょうか?それでも同じエラーが出ます。
alkeran

2017/06/19 12:14

xxx.csvをメモ帳でみると以下のようになっていました。ダブルクォーテーションもエラーの原因になっているのでしょうか? code($row[0]) price($row[5]) 1234565789,"7,596" 987654321,"1,430" 2468101214,"7,150" 135791113,"2,520"
yambejp

2017/06/19 12:20

ダブルクォーテーションはカンマ入りの数字を文字列として持たせるための仕様なので 問題ないです。str_replaceはそのカンマを取っています。 ちなみにそれを展開したSQL文の以下を実行して データは更新されるでしょか? update tb_name set price=COALESCE(ELT(FIELD(code,1234565789,987654321, 2468101214,135791113..., 999999999 ), 7596,1430,7150,2520,1220,6100,6100,1660,8300,4530,22650,22650,4840,7930,5020,25100),price);
alkeran

2017/06/19 12:33

#1054 - Unknown column '1234565789' in 'field list' 上記のエラーが出ました。もしかして、'1234565789'がカラムと思われています。codeの値なのですが...。
yambejp

2017/06/19 12:55

もう少し単純なサンプル update tb_name set price=COALESCE(ELT(FIELD(code,1234565789),7596),price); ではダメですか?
alkeran

2017/06/19 12:57

同じエラーメッセージが出ました。
yambejp

2017/06/19 13:04

テーブルの構造自体が間違えているのでは? tb_nameテーブルにpriceやcodeカラムはちゃんとありますか? テストデータ create table tb_name (id int unique,price int,code int); insert into tb_name values(1,100,1000),(2,200,2000),(3,99999,1234565789),(4,400,4000); これに対して update tb_name set price=COALESCE(ELT(FIELD(code,1234565789),7596),price); id=3の99999が7596に変更されるところまで確認して下さい
alkeran

2017/06/19 13:11

変更されました。すみませんでした。 なにが間違っているのか探します。
alkeran

2017/06/19 13:16

申し訳ありません。 codeは数字だけでなくアルファベットも含むため、intではなくvarcharです。これが原因でしょうか?
yambejp

2017/06/19 13:22

いえ、varcharでも自動でキャストされるので問題ないです create table tb_name (id varchar(20) unique,price int,code int); insert into tb_name values(1,100,1000),(2,200,2000),(3,99999,1234565789),(4,400,4000); update tb_name set price=COALESCE(ELT(FIELD(code,1234565789),7596),price); 一応カラム名に実は予約語をつかっている状況かもしれないので プログラムに組み込む際はバッククォートしてみてください update `tb_name` set `price`=COALESCE(ELT(FIELD(`code`,1234565789),7596),`price`);
alkeran

2017/06/19 13:26

バックオーテーションを使っても同じエラーでした。使用しているカラムは予約語ではないようです。
yambejp

2017/06/19 13:32

手入力は通るけど、プログラムでエラーという状況で間違いないですか? prepare処理を一度はずして、queryを実行してみてはどうでしょうか? $sql='update tb_name set price=COALESCE(ELT(FIELD(code,1234565789),7596),price)'; $mysqli->query($sql);
alkeran

2017/06/19 13:34

code varchar(20)でも問題ないですよね?
alkeran

2017/06/19 13:54 編集

<?php // mysqliクラスのオブジェクトを作成 $mysqli = new mysqli('xxx', 'xxx', 'xxx', 'xxx'); if ($mysqli->connect_error) { echo $mysqli->connect_error; exit(); } else { $mysqli->set_charset("utf8"); } $sql='update `tb_name` set `price`=COALESCE(ELT(FIELD(`code`,1234565789),7596),`price`)'; $mysqli->query($sql); ?> これでも更新されませんでした。
yambejp

2017/06/19 14:11

ちょっと自信がなくなってきました。 オブジェクト指向型msqliが必須条件でしょうか? PDOならもう少しブレがすくないと思うのですが・・・
alkeran

2017/06/19 14:15

もうしわけありません。初心者で...^^; msqliとPDOの違いは判りませんが、気にしたことありませんでした。 ちなみに、2017/06/19 22:22 のコードは成功したため、カラム名が違うなど単純なミスかもしれません。探してみたいと思います。
alkeran

2017/06/19 14:27

9.00E+11 というcodeがあったため、何気なく以下を試したらpriceが更新されました。 なぜでしょうか? $sql='update `tb_name` set `price`=COALESCE(ELT(FIELD(`code`,9.00E+11),7596),`price`)';
alkeran

2017/06/21 05:10 編集

1.00E+12 でも更新されました。
guest

0

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in

-> 2番目の引数は、リファレンスであるべきなのに、value が与えられた。

2番目の引数が変数ではないということでしょうか?

逆ですね。

投稿2017/06/18 02:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alkeran

2017/06/18 02:25

ありがとうございます。 $paramsを変数ではなく、リファレンスにしなさいよ、ということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問