0

我已经阅读了所有我能想到的解释,但似乎没有任何帮助。如果有人能够指出明显的问题或让我稍微了解一下哪里出了问题。我已经阅读了 php.net 和mysqli标签,但似乎无法弄清楚这一点。我读到的所有内容都说您不能发送两个查询,但我只尝试一个。任何帮助将非常感激。

这-> https://stackoverflow.com/a/9649149/1626329 - 说我可能有多个结果集,但我不确定这是否有意义,或者我可以做些什么来获得有关准备好的语句的内部工作的更多细节.

我的代码:

class mydb {

    public function __construct() {
        // Connect to Database
        $this->mydb = new mysqli('****', '***', '***', '***');
        if ($this->mydb->connect_errno) { // Error on connection failure
            echo "Failed to connect to MySQL in Construct: (" . $this->mydb->connect_errno . ") " . $this->mydb->connect_error;
        }
    }

    public function choose ($select, $from, $config = 0, $options = NULL) {
        if ($config === 0) { /** Configure statement for prepare depending on options */
            $stmt = 'SELECT ' . $select . ' FROM ' . $from;
        } elseif ($config === 1) {
            $stmt = 'SELECT ' . $select . ' FROM ' . $from . ' WHERE ' . $options['where_comp'] . ' LIKE ?';
        } elseif ($config === 2) {
            $stmt = 'SELECT ' . $select . ' FROM ' . $from . ' WHERE ' . $options['where_comp'] . ' = ?';
        } /** End if/elseif Prepare statemenet */
        $mydb = $this->mydb->prepare($stmt);
        if ($config === 1 || $config === 2) {
            $mydb->bind_param("s",$options['where_value']);
        }

        if ($mydb->execute()) { /** If execute is good then get results */
            $result = $mydb->get_result();
            $payload = array();
            while ($row = $result->fetch_array(MYSQLI_NUM)) {
                $payload[] = $row;
            }
            return $payload;
        } /** End if results */
    } /** End choose class method */
} /** End mydb Class */

$myDB = new mydb();

$agentArray = $myDB->choose('*','`agent`');

使用了 php.net 示例并对其进行了修改以显示更好的示例:

$mysqli = new mysqli('host', 'database', 'user', 'pass');
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!($res = $stmt->get_result())) {
    echo "Getting result set failed: (" . $stmt->errno . ") " . $stmt->error;
}

for ($row_no = ($res->num_rows - 1); $row_no >= 0; $row_no--) {
    $res->data_seek($row_no);
    var_dump($res->fetch_assoc());
}
$res->close();
4

2 回答 2

1

此页面上“相关”部分的第一个结果(意味着它是在您努力编写问题时提供给您的)提供了一个解决方案

作为一般规则,根据错误消息很容易找到问题的答案。只需要不要停留在第一个搜索结果上,而是继续前进。

但是,关于choose()你的这个功能。我发现它非常不切实际,不安全且无用:

  • 不切实际,因为它不允许您使用 SQL,而是它的一个非常有限的子集。
    • 而且它使您的代码非常难以理解。
  • 不安全,因为它确实没有为所有动态部件提供保护,但只有价值
  • 没用,因为它可以为您节省很多钱,而不是一团糟。

看,您认为您为自己节省了 2 个字 -SELECTFROM.

 $agentArray = $myDB->choose('*','`agent`',1,
               array('where_comp' => 'name', 'where_value' -> "%bob%"));

但是您使此代码难以理解,难以维护并且无法运行最简单的 JOIN。为什么不去做。更不用说实际代码比传统的 SQL 查询更长:

$sql = 'SELECT * FROM `agent` WHERE name LIKE ?';
$agentArray = $myDB->query($sql, "%bob%");

哪个更容易阅读?

于 2013-08-09T07:17:07.793 回答
-1

添加一个 if 语句来正确显示错误实际上给出了一个可以使用的 mysql 错误响应:

if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

错误响应: Prepare failed: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

-- 你不能通过准备好的语句传递标识符,你应该只将它用于从用户输入传递的值。

于 2013-08-09T22:09:29.550 回答