0

このエラーが発生しましたが、理由がわかりません:

致命的なエラー: オブジェクト以外でのメンバー関数 bind_param() の呼び出し

$string = file_get_contents($url, false, $context);
$xml    = new SimpleXMLElement($string);

if ($stmt->prepare("INSERT INTO table (id, filePointer, amount, description) 
                        VALUES (?, ?, ?, ?)"))
{
    foreach ($xml->machine as $machine) 
    {
        $stmt->bind_param('ssss', $machine->id, $machine->images->image->filePointer, $machine->advertised_price->amount, $machine->description);
        // Execute the query
        $stmt->execute();
        $stmt->close();
    }

}

テーブルを呼び出す方法は次のとおりです。

//Create table
$create_table =
'CREATE TABLE IF NOT EXISTS table  
(
    id INT NOT NULL,
    filePointer TEXT NOT NULL,
    amount INT NOT NULL,
    description TEXT NOT NULL
    PRIMARY KEY(id)
)';

$create_tbl = $db->query($create_table);
if ($create_table)
{
    echo "Table has been created";
} 
else 
{
        echo "error!!";  
}

以前は、MyPHPAdmin でテーブルを作成していました。これを実行してデータベースを確認すると、テーブルが作成されていないか、更新されていません。データベースに接続していることを確認しましたが、私が知る限り、それは機能しています。

私の新しい INSERT INTO コード:

$stmt =  $db->stmt_init();

if ($stmt->prepare("INSERT INTO table (id, filePointer, amount, description) 
                        VALUES (?, ?, ?, ?)"))
{
    $id          = 0;
    $filePointer = '';
    $amount      = 0;
    $description = '';
    $stmt->bind_param('isis', $id, $filePointer, $amount, $description);

    foreach ($xml->machine as $machine) 
    {
        $id          = $machine->id;
        $filePointer = $machine->images->image->filePointer;
        $amount      = $machine->advertised_price->amount;
        $description = $machine->description;
        if (!$stmt->execute())
        { 
            echo "error : ".$id."<br />\n";
            break;
        }     
    }

    $stmt->close();
}
4

2 に答える 2

1

が成功しないため、$stmt は false を返しますprepare

テーブル名を除いてSQLは正常に見えるため、データベース接続が確立されていない可能性があります。

接続を行った後、次のコードを試してください。

if ($db->connect_errno) {
    printf("Connect failed: %s\n", $db->connect_error);
    exit();
}

これは $stmt を準備した後、失敗したため false を返しますprepare

テーブル名を除いてSQLは正常に見えるため、データベース接続が確立されていない可能性があります。

接続を行った後、次のコードを試してください。

if (!$stmt) {
    printf("Errormessage: %s\n", $db->error);
}
于 2013-06-13T21:02:22.257 に答える
1

で試しました$db->stmt_init()か?

$stmt =  $db->stmt_init();

if ($stmt->prepare("INSERT INTO table (id, filePointer, amount, description) VALUES (?, ?, ?, ?)")) {

....

$stmt->bind_param('ssss', $id, $filepointer, $amount, $description);

....
}

アップデート :

または、対応する変数のタイプが整数でd、金額 (Double) の 'i' を使用します。

$stmt->bind_param('isds',  $machine->id, $machine->images->image->filePointer, $machine->advertised_price->amount, $machine->description);

UPDATE2 :

  • bind_param(ループ内ではなく)1回だけ実行する必要があります。
  • $stmt->close();ループの外側でのみ使用してください。

if ($stmt->prepare("INSERT INTO table (id, filePointer, amount, description) VALUES (?, ?, ?, ?)")) {
  $id = 0;
  $filePointer = '';
  $amount = 0.0;
  $description = '';
  $stmt->bind_param('isds', $id, $filePointer, $amount, $description);

  foreach ($xml->machine as $machine) {
    $id          = $machine->id;
    $filePointer = $machine->images->image->filePointer;
    $amount      = $machine->advertised_price->amount;
    $description = $machine->description;
    if (!$stmt->execute()) { 
        echo "error : ".$id."<br />\n";
        break;
       }     
    }

  $stmt->close();

更新 3:

  • の後にコンマを忘れたdescription TEXT NOT NULL

$create_table =
'CREATE TABLE IF NOT EXISTS table  
(
    id INT NOT NULL,
    filePointer TEXT NOT NULL,
    amount INT NOT NULL,
    description TEXT NOT NULL
    PRIMARY KEY(id)
)';

これを試して:

$create_tbl = "CREATE TABLE faulty(
      id INT NOT NULL,
      filePointer TEXT NOT NULL,
      amount INT NOT NULL,
      description TEXT NOT NULL,
      PRIMARY KEY(id)
      )";

if ($db->query($create_table) === TRUE) {
  echo 'Table "faulty" successfully created';
}
else {
 echo 'Error: '. $db->error;
}

$db->close();
于 2013-06-13T21:19:28.153 に答える