phpのfunctionについて質問です。


現在MDB2を利用して、下記のようにinsertする場面がいくつかでてきたため関数にしておこうと考えています。
$row = array(
'id' => '$id',
'name' => '$name',
'profile_image_mobile' => '$profile_image_mobile',
'gender' => '$gender',
'created' => '$date',
'updated' => '$date',
);

function insertMember($row){
$sql = "insert into member(
member_id,
name,
profile_image_mobile,
gender,
created,
updated
) VALUES(?,?,?,?,?,?)";

$sth = $mdb2->prepare($sql);
$data = array(
$member_id,
$name,
$profile_image_mobile,
$gender,
$date,
$date
);

$result = $sth->execute($data);

}
このままだとうまく関数が働いてくれないのですが、、、よくわかっておらずうまい書き方があれば教えていただけないでしょうか。

よろしくお願いいたします。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/10/12 15:43:12
  • 終了:2011/10/19 15:45:03

ベストアンサー

id:tdoi No.2

tdoi回答回数174ベストアンサー獲得回数752011/10/12 19:18:47

ポイント50pt

僕の環境ではこれで問題なく動きます。

insertMemberには配列で、insertMemberAssocには連想配列でデータを渡す必要があります。

<?php
require_once 'MDB2.php';

$dsn = 'mysql://user:password@localhost/test';
$options = array(
    'debug' => 2,
    'result_buffering' => false,
);

$mdb2 =& MDB2::factory($dsn, $options);

$data = array(1000,
	      'テスト太郎',
	      'http://example.com/image.png',
	      1,
	      date('Y-m-d H:i:s'),
	      date('Y-m-d H:i:s'));
insertMember($data);

$data = array('member_id'            => 1001,
	      'name'                 => 'テスト次郎',
	      'profile_image_mobile' => 'http://example.com/image.png',
	      'gender'               => 1,
	      'created'              => date('Y-m-d H:i:s'),
	      'updated'              => date('Y-m-d H:i:s'));
insertMemberAssoc($data);


$mdb2->disconnect();

function insertMember($row)
{
  global $mdb2;

  $sql = <<< SQL
INSERT INTO
    member
(member_id,
 name,
 profile_image_mobile,
 gender,
 created,
 updated
)
VALUES
 (?,?,?,?,?,?)
SQL;

  $sth = $mdb2->prepare($sql);
  if (PEAR::isError($sth)) {
    die($sth->getMessage());
  }
  $result = $sth->execute($row);
  if (PEAR::isError($result)) {
    die($result->getMessage());
  }
}

function insertMemberAssoc($row)
{
  global $mdb2;

  $sql = <<< SQL
INSERT INTO
    member
(member_id,
 name,
 profile_image_mobile,
 gender,
 created,
 updated
 )
VALUES
    (:member_id, :name, :profile_image_mobile, :gender, :created, :updated)
SQL;

  $sth = $mdb2->prepare($sql);
  if (PEAR::isError($sth)) {
    die($sth->getMessage());
  }
  $result = $sth->execute($row);
  if (PEAR::isError($result)) {
    die($result->getMessage());
  }
}

?>

何かの参考になれば。

id:kuso47

すみません、ありがとうございました。

2011/10/22 11:37:25

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/10/12 16:41:19

ポイント50pt

連想配列にする必要が わからないのですが・・・。


$row = array(

'id' => '$id',

'name' => '$name',

'profile_image_mobile' => '$profile_image_mobile',

'gender' => '$gender',

'created' => '$date',

'updated' => '$date',

);

は 単純に

$row = array(

$id,

$name,

$profile_image_mobile,

$gender,

$date,

$date,

);

とやったら ダメなのかな?

id:kuso47

コメントありがとうございます。両方で試してみてダメだったのです。

2011/10/12 16:47:11
id:tdoi No.2

tdoi回答回数174ベストアンサー獲得回数752011/10/12 19:18:47ここでベストアンサー

ポイント50pt

僕の環境ではこれで問題なく動きます。

insertMemberには配列で、insertMemberAssocには連想配列でデータを渡す必要があります。

<?php
require_once 'MDB2.php';

$dsn = 'mysql://user:password@localhost/test';
$options = array(
    'debug' => 2,
    'result_buffering' => false,
);

$mdb2 =& MDB2::factory($dsn, $options);

$data = array(1000,
	      'テスト太郎',
	      'http://example.com/image.png',
	      1,
	      date('Y-m-d H:i:s'),
	      date('Y-m-d H:i:s'));
insertMember($data);

$data = array('member_id'            => 1001,
	      'name'                 => 'テスト次郎',
	      'profile_image_mobile' => 'http://example.com/image.png',
	      'gender'               => 1,
	      'created'              => date('Y-m-d H:i:s'),
	      'updated'              => date('Y-m-d H:i:s'));
insertMemberAssoc($data);


$mdb2->disconnect();

function insertMember($row)
{
  global $mdb2;

  $sql = <<< SQL
INSERT INTO
    member
(member_id,
 name,
 profile_image_mobile,
 gender,
 created,
 updated
)
VALUES
 (?,?,?,?,?,?)
SQL;

  $sth = $mdb2->prepare($sql);
  if (PEAR::isError($sth)) {
    die($sth->getMessage());
  }
  $result = $sth->execute($row);
  if (PEAR::isError($result)) {
    die($result->getMessage());
  }
}

function insertMemberAssoc($row)
{
  global $mdb2;

  $sql = <<< SQL
INSERT INTO
    member
(member_id,
 name,
 profile_image_mobile,
 gender,
 created,
 updated
 )
VALUES
    (:member_id, :name, :profile_image_mobile, :gender, :created, :updated)
SQL;

  $sth = $mdb2->prepare($sql);
  if (PEAR::isError($sth)) {
    die($sth->getMessage());
  }
  $result = $sth->execute($row);
  if (PEAR::isError($result)) {
    die($result->getMessage());
  }
}

?>

何かの参考になれば。

id:kuso47

すみません、ありがとうございました。

2011/10/22 11:37:25
  • id:tdoi
    明確なことはいえないですが、関数は使っているものそのままですか?

    もし、そうなら、$mdb2が未定義のようです。
    グローバルに$mdb2を用意しているのであれば、関数内ではそのままでは見えませんので、
    global $mdb2;
    などと宣言してあげる必要があります。

    もう少し、どのようにうまく動かないか分かれば、もう少し踏み込めるかもしれません。

    何かの参考になれば。
  • id:kuso47
    ありがとうございます。
    関数は使っているものそのままです。

    エラーがでてくるのは確かに
    $sth = $mdb2->prepare($sql);
    ここなのですが、phpファイルの中に

    <?php
    require_once("/usr/share/pear/MDB2.php");
    require_once("../../macros/db_connect.php");
    という形で読み込みは行っているのですがこれではダメ?ということでしょうか。。
    functionを使わない形だと実装ができているのですが、、、

  • id:tdoi
    関数使わなければOKなら、関数の先頭にでも

    global $mdb2;

    と書いて試してみてください。
    takntさんがおっしゃるように、連想配列そのままも問題だと思うので、$dataを作るとこも注意してみてください。
  • id:kuso47
    頂いた形でやってみたところ、エラーはでなかったのですがDBへの登録はされていませんでした。。。
    emptyとなっていました。

    $row = array(
    $id,
    $name,
    $profile_image_mobile,
    $gender,
    $date,
    $date,
    );

    function insertMember($row){
    global $mdb2;
    $sql = "insert into member(
    member_id,
    name,
    profile_image_mobile,
    gender,
    created,
    updated
    ) VALUES(?,?,?,?,?,?)";

    $sth = $mdb2->prepare($sql);
    $data = array(
    $member_id,
    $name,
    $profile_image_mobile,
    $gender,
    $date,
    $date
    );

    $result = $sth->execute($data);

    }
  • id:kuso47
    function自体は実行されたが、$rowのデータがなかったため登録されなかった?ということなのでしょうか。
  • id:tdoi
    これが実際のコピーなら駄目です。
    関数の外の変数は関数内から見えないので、引数である$rowから構築する必要があります。

    $data = array(
    $row['member_id'],
    $row['name'],
    $row['profile_image_mobile'],
    $row['gender'],
    $row['date'],
    $row['date']
    );

    こんな感じでしょうか。
  • id:kuso47
    ありがとうございます。
    以下で試してみたのですが、、、やはり空でした。


    $row = array(
    $id,
    $name,
    $profile_image_mobile,
    $gender,
    $date,
    $date,
    );

    function insertMember($row){
    global $mdb2;
    $sql = "insert into member(
    member_id,
    name,
    profile_image_mobile,
    gender,
    created,
    updated
    ) VALUES(?,?,?,?,?,?)";

    $sth = $mdb2->prepare($sql);
    $data = array(
    $row['member_id'],
    $row['name'],
    $row['profile_image_mobile'],
    $row['gender'],
    $row['date'],
    $row['date']
    );

    $result = $sth->execute($data);

    }
  • id:tdoi
    $rowがただの配列なら、
    $result = $sth->execute($row);
    でいいです。

    意味は理解してコード書いてらっしゃいますか?
  • id:kuso47
    すみません、プログラミングをはじめて間もないもので右往左往しながら取り組んでいる次第です。
    ポロポロと質問してしまいすいませんでした。

    変数名を間違えていたため関数が実行されていませんでした。。。

    勉強を続けてまいりますので、またよろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません