PHP从MYSql视图中选择返回Nothing

时间:2016-03-12 21:15:58

标签: php mysql mysqli view resultset

这很奇怪,我似乎无法找到错误。 这是一个简单的例子:

在我的PHP代码中,我可以从表中进行选择并返回结果。 但是,如果我更改我的SQL语句以从视图中进行选择,则不会返回任何结果。

此代码返回结果:

$link = mysqli_connect(HOST, USER, PASSWORD, DATABASE);
$sql_stmt_bind = "Select fk_member_id as ID FROM member_role LIMIT 1";

$stmt = $link->stmt_init();
$stmt->prepare($sql_stmt_bind);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($mem_id);
$stmt->fetch();

echo '<br>';
echo 'rows: ' . $stmt->num_rows;
echo '<br>';
//echo 'lastname: ' . $lastname;
echo 'ID: ' . $mem_id;
echo '<br>';

结果:

rows: 1
ID: 1

此代码返回意外结果:

$link = mysqli_connect(HOST, USER, PASSWORD, DATABASE);
$sql_stmt_bind = "Select fk_member_id as ID FROM vw_test LIMIT 1";

$stmt = $link->stmt_init();
$stmt->prepare($sql_stmt_bind);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($mem_id);
$stmt->fetch();

echo '<br>';
echo 'rows: ' . $stmt->num_rows;
echo '<br>';
//echo 'lastname: ' . $lastname;
echo 'ID: ' . $mem_id;
echo '<br>';

结果:

rows: 0
ID: 0

这是视图的Create语句:

Create or replace View vw_test
 as
Select fk_member_id FROM member_role 
;

所以我完全失去了。 在过去的4年或5年里,我一直在运行相同的代码而没有任何问题。 (这是一个社区体育协会,一年只运行几个月。) 在我再次打开网页之前,我正在仔细检查代码......现在我访问视图的所有代码都不再有效。

请帮忙!感谢。

更新

我现在正在使用此代码段:

    $stmt = $link->stmt_init();
    $pre = $stmt->prepare($sql_stmt_bind);
    if ( false===$pre ) {
      die('prepare() failed: ' . htmlspecialchars($stmt->error));
    }

    $exe = $stmt->execute();
    if ( false===$exe ) {
      die('execute() failed: ' . htmlspecialchars($stmt->error));
    }

    $stmt->store_result();

    $bind_r = $stmt->bind_result($mem_id);
    if ( false===$bind_r ) {
      die('bind_result() failed: ' . htmlspecialchars($stmt->error));
    }

    $stmt->fetch();

我现在收到的错误是:

execute() failed: Prepared statement needs to be re-prepared

任何想法?感谢。

1 个答案:

答案 0 :(得分:0)

尝试检查您的代码以了解问题所在。

试试这个:

    $link = mysqli_connect(HOST, USER, PASSWORD, DATABASE);
    $sql_stmt_bind = "Select fk_member_id as ID FROM vw_test LIMIT 1";

    $stmt = $link->stmt_init();
    $pre = $stmt->prepare($sql_stmt_bind);

if ( false===$pre ) {
  die('prepare() failed: ' . htmlspecialchars($stmt->error));
}

  $exe =  $stmt->execute();

if ( false===$exe ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}

    $stmt->store_result();
    $bind_r = $stmt->bind_result($mem_id);

if ( false===$bind_r ) {
  die('bind_result() failed: ' . htmlspecialchars($stmt->error));
}

    $stmt->fetch();

    echo '<br>';
    echo 'rows: ' . $stmt->num_rows;
    echo '<br>';
    //echo 'lastname: ' . $lastname;
    echo 'ID: ' . $mem_id;
    echo '<br>';

修改

解决问题(失败:准备好的陈述需要重新准备) - 使用PDO适配器而不是Mysql适配器 - 将此属性添加到连接字符串$link->setAttribute( PDO::ATTR_EMULATE_PREPARES, true);