0

最初の準備ステートメントが正常に機能するのに、2 番目のステートメントが機能しない理由を理解しようとしています。実際の INSERT INTO 構文は正しいように見え、数値を置き換えて mysql コンソールに配置すると機能しますが、準備ステートメントは false を返します。

簡単な質問を片付けるために。$db_table_prefix == "uc_" で、すべての変数が初期化されます。また、最初のステートメントは $results == 0 を設定します (編集: これは私の間違いでした。実際には 1 ではなく 0 です)。

global $mysqli,$db_table_prefix;

$stmt = $mysqli->prepare("SELECT COUNT(id) FROM ".$db_table_prefix."attempts WHERE ((exp_m = ?) AND (exp_n = ?) AND (max_base <= ?))");
$stmt->bind_param("iii", $m, $n, $this->max_base);
$stmt->execute();
$stmt->bind_result($results);
$stmt->fetch();

if ($results < 1)
{ 
  $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."attempts (exp_m, exp_n, base_x, max_base) VALUES (?,?,?,?)");
  $stmt->bind_param("iiii", $m, $n, $x, $this->max_base);

  .....
}

問題が発生した場合に備えて、テーブル構造を含めました。

mysql> describe uc_attempts;
+----------+---------------------+------+-----+---------+----------------+
| Field    | Type                | Null | Key | Default | Extra          |
+----------+---------------------+------+-----+---------+----------------+
| exp_m    | bigint(20) unsigned | NO   |     | NULL    |                |
| exp_n    | bigint(20) unsigned | NO   |     | NULL    |                |
| base_x   | bigint(20) unsigned | YES  |     | NULL    |                |
| max_base | bigint(20) unsigned | NO   |     | NULL    |                |
| id       | int(11)             | NO   | PRI | NULL    | auto_increment |
+----------+---------------------+------+-----+---------+----------------+

簡単なものが欠けているだけだと思いますが、数日間コードを見つめた後、質問する必要がありました。助けてくれてありがとう。他に含めるべき情報があれば教えてください。

4

1 に答える 1

1

最初のリソースを閉じるのを忘れました。最初のステートメントが閉じられていない場合、2 番目の準備済みステートメントを開くことはできないと思います。$mysqli->prepare( ... );その後、falseが返され、明らかにfalse->bind_param( ... );存在しないと思います;-)エラーが発生しますFatal error: Call to a member function bind_param() on a non-object

global $mysqli,$db_table_prefix;

$stmt = $mysqli->prepare("SELECT COUNT(id) FROM ".$db_table_prefix."attempts WHERE ((exp_m = ?) AND (exp_n = ?) AND (max_base <= ?))");
$stmt->bind_param("iii", $m, $n, $this->max_base);
$stmt->execute();
$stmt->bind_result($results);
$stmt->fetch();
$stmt->close(); //<-- this is the problem

if ($results < 1)
{ 
  $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."attempts (exp_m, exp_n, base_x, max_base) VALUES (?,?,?,?)");
  $stmt->bind_param("iiii", $m, $n, $x, $this->max_base);

  .....
}
于 2013-06-28T16:58:12.080 に答える