2010-08-24 42 views
5

Tôi đang cố gắng hiểu sự khác biệt giữa truy vấn mysqli() và chuẩn bị(). Tôi có mã như dưới đây, và tôi muốn có được kết quả tương tự từ cả hai. Tuy nhiên, chuẩn bị() không hoạt động như mong đợi. tại sao?Chuẩn bị() vs truy vấn() mysqli

// this works 

    if ($query = $this->db->query("SELECT html FROM static_pages WHERE page = 'cities'")) { 

    $result = $query->fetch_row(); 
    echo $result[0]; 

    $query->close(); 

    } 

    //this does not work 
    //result is empty 

    $cities = 'cities'; 

    $stmt = $this->db->prepare("SELECT html FROM static_pages WHERE page = ?"); 
    $stmt -> bind_param("s", $cities); 
    $stmt->execute(); 
    $stmt->bind_result($result); 
    $stmt->fetch(); 
    echo $result; 
    $stmt->close(); 

    $this->db->close(); 

đây là những configs máy chủ của tôi theo yêu cầu:

OS

Vista 64bit/PHP Version 5.2.9

mysqli

mysqli Hỗ trợ kích hoạt

Client API thư viện phiên bản 5.0.51a

Client API tiêu đề phiên bản 5.0.51a

MYSQLI_SOCKET /tmp/mysql.sock

Chỉ thị Local Value Thạc sĩ Value

mysqli. default_host không có giá trị không có giá trị

mysqli.default_port 3306 3306

mysqli.default_pw không có giá trị không có giá trị

mysqli.default_socket không có giá trị không có giá trị

mysqli.default_user không có giá trị không có giá trị

mysqli.max_links Unlimited Unlimited

mysqli.reconnect Tắt Tắt

+0

bạn phải in $ stmt-> error() để xem điều gì đang xảy ra. –

+0

Ah, xin lỗi, đó là một biến, không phải phương pháp. $ stmt-> error –

+0

Trong trường hợp đó $ stmt-> error không có giá trị nào cả. Tôi đã thử nó trên tất cả các dòng. – Mike

Trả lời

2

Bạn có thể thử $stmt->store_result(); giữa $stmt->execute();$stmt->bind_result($result);?

+0

R DONG NHANH. Bây giờ để học tập, store_results(). Cảm ơn rất nhiều. Tôi mới đến mysqli, cố gắng quấn quanh đầu tôi. – Mike

+0

Kiểm tra để biết thêm chi tiết: http://us3.php.net/manual/en/mysqli-stmt.store-result.php .Btw, nếu có, tôi sẽ rất vui khi nhận được '+' – a1ex07

+0

Trên một mặt lưu ý, nó làm cho bạn tự hỏi tại sao bind_result là không đủ. – Mike

0

Phải là echo $result; không echo $results;

+0

Rất tiếc, đó là lỗi, nhưng không phải là lý do tại sao điều này không hoạt động. Tôi chỉ cố định nó trong mã trực tiếp và nó vẫn trả về sản phẩm nào. – Mike

+0

@ Giống như lý do bạn phải hỏi chương trình của mình, chứ không phải những người không biết chuyện gì đang diễn ra. Tôi không có một thông dịch viên PHP trong đầu để chạy mã của bạn và xem kết quả. Bạn phải làm điều đó cho chính bản thân mình. Không có hành vi phạm tội - đó chỉ là cách duy nhất. –

+0

cũng thực tế là truy vấn() hoạt động và chuẩn bị() không, mặc dù thực tế rằng họ có cùng một dữ liệu chính xác sẽ cho bạn biết điều gì đó. Hai chức năng đó có thể hoán đổi cho nhau không, theo nghĩa mã tôi có ở trên. – Mike

2

Bất kỳ chức năng mysqli_ * nào đều không thành công. Trong trường hợp này, giá trị trả về là false và thuộc tính lỗi/errno của đối tượng mysqli hoặc mysqli_stmt chứa nhiều thông tin hơn về lỗi. Tập lệnh phải kiểm tra từng giá trị trả về và phản ứng phù hợp với điều kiện lỗi (ví dụ: không có ý nghĩa khi chuẩn bị câu lệnh nếu kết nối không thành công).

<?php 
$foo = new Foo; 
$foo->init(); 
$foo->bar(); 
class Foo { 
    public function bar() { 
    $cities = 'cities'; 
    $stmt = $this->db->prepare("SELECT html FROM soTest WHERE page = ?"); 
    if (!$stmt) { 
     echo "prepare failed\n"; 
     echo "error: ", $this->db->error, "\n"; 
     return; 
    } 

    $rc = $stmt->bind_param("s", $cities); 
    if (!$rc) { 
     echo "bind_param failed\n"; 
     echo "error: ", $stmt->error, "\n"; 
     return; 
    } 

    $rc=$stmt->execute(); 
    if (!$rc) { 
     echo "execute failed\n"; 
     echo "error: ", $stmt->error, "\n"; 
     return; 
    } 

    $rc = $stmt->bind_result($result); 
    if (!$rc) { 
     echo "bind_result failed\n"; 
     echo "error: ", $stmt->error, "\n"; 
     return; 
    } 

    $rc = $stmt->fetch(); 
    if (!$rc) { 
     echo "no such record\n"; 
    } 
    else { 
     echo 'result: ', $result, "\n"; 
    } 
    $stmt->close(); 
    } 

    public function init() { 
    $this->db = new mysqli('localhost', 'localonly', 'localonly', 'test'); 
    if ($this->db->connect_error) { 
     die('connection failed: ' . $this->db->connect_error); 
    } 
    $rc = $this->db->query('CREATE TEMPORARY TABLE 
     soTest (id int auto_increment, html varchar(16), page varchar(16),primary key(id))' 
    ); 
    if (!$rc) { die('error: '.$this->db->error); } 
    $rc = $this->db->query("INSERT INTO soTest (html,page) VALUES ('htmlFoo','foo'),('htmlCities','cities')"); 
    if (!$rc) { die('error: '.$this->db->error); } 
    } 
} 

Lưu ý CWE-209: Information Exposure Through an Error Message. Việc in thông báo lỗi thực tế trong tập lệnh mẫu của tôi chỉ để thử nghiệm. Và bạn có thể sử dụng xử lý lỗi phức tạp hơn một chút so với chỉ die().

Các vấn đề liên quan