2013-07-30 140 views
-1

我試圖創建一個函數來檢查在使用mysqli(全新的我)的mysql中的重複條目,但我不能讓我的頭繞着這個錯誤。我有3個PHP文件:db.php - db連接functions.php與我的功能(需要db.php)和submit.php - 接受輸入的文件。致命的錯誤調用成員函數prepare()在非對象

db.php中:

<?php 
define("HOST", "localhost"); // The host you want to connect to. 
define("USER", "user"); // The database username. 
define("PASSWORD", "pass"); // The database password. 
define("DATABASE", "db_list"); // The database name. 

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE); 
?> 

的functions.php:

require 'db.php'; 
function check($str, $mysqli) { 

$checkdupe = $mysqli->prepare("SELECT name FROM list WHERE str = ?"); //line giving me error 
$checkdupe->bind_param("s", $str); 
$checkdupe->execute(); 
$checkdupe->store_result(); 

    if ($checkdupe->num_rows > 0) { 
     //dupe found 
     return true; 
    } else { 
      //no dupe 
      return false; 
    } 
} 

submit.php

require 'functions.php'; 

if (isset($_POST['name'])) { 
    if (check($_POST['name'], $mysqli) == true) { //added $mysqli parameter 
     echo "success!"; 
    } else { 
     echo "fail; 
    } 
} else { 
    echo 'invalid post'; 
} 
?> 
+1

向我們展示如何調用check()函數。 –

+0

這不是PDO ...這是mysqli,你應該有更好的錯誤處理。如果' - > prepare()'導致錯誤,那麼'$ mysqli'不是一個有效的數據庫連接句柄(週期,或者至少在腳本中的那個點,例如範圍問題),並且可能是'connect'通話失敗。 –

+0

我們可以看到你的'submit.php'文件嗎?這對確定錯誤的位置很有必要。 – Phas1c

回答

-2

嘗試:

global $mysqli; 
check($mysqli, ...); 
+0

不喜歡!不是一個好的解決方案 – steven

+1

在這種情況下,'check()'函數中的'$ mysqli'參數應該被移除,因爲它不需要被傳遞。 – Phas1c

+0

@steven如何提供參數和解釋而不是討厭? – Virus721

2

你的功能定義是

function check($str, $mysqli) { 

但你只用第一個參數調用它。結果第二個參數爲空。

check($_POST['name']) 

所以使用,

check($_POST['name'], $mysqli) 

你也沒有做任何檢查連接是否確實在全成db.php中。在文件末尾加上:

if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' 
      . $mysqli->connect_error); 
} 
+0

要添加,爲了這個工作,你需要在使用之前聲明'$ mysqli'作爲全局(在'db.php'和'submit.php'中),__OR__你可以'需要'db。 'submit.php'中的php''。 __ALSO__在OP的問題中有一個語法錯誤,'echo'失敗;'應該是'echo'失敗;' – Phas1c

+1

with required()就足夠了如果required()在函數調用之前,它作爲一個函數參數和沒有全球需要 – Aris

+0

只是試過這個,沒有骰子 – user2480651

0

您的功能check需要2個參數。你只分配1個屬性給它:

if (check($_POST['name']) == true)

應該

if (check($_POST['name'], $mysqli) == true)

-1

db.php中:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors',1); 

define("HOST", "localhost"); // The host you want to connect to. 
define("USER", "user"); // The database username. 
define("PASSWORD", "pass"); // The database password. 
define("DATABASE", "db_list"); // The database name. 

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE); 
var_dump('db:',is_object($mysqli)); 

的functions.php:

<?php 
require 'db.php' 
var_dump('functions:',is_object($mysqli)); 
function check($str, $mysqli) { 
    var_dump('check:',is_object($mysqli)); 

    $checkdupe = $mysqli->prepare("SELECT name FROM list WHERE str = ?"); 
    $checkdupe->bind_param("s", $str); 
    $checkdupe->execute(); 
    $checkdupe->store_result(); 
    return $checkdupe->num_rows; 
} 

submit.php

<?php 
require 'functions.php'; 
var_dump('submit:',is_object($mysqli)); 


if (isset($_POST['name'])) { 
    if (check($_POST['name'], $mysqli)) { 
     echo "success!"; 
    } else { 
     echo "fail"; 
    } 
} else { 
    echo 'invalid post'; 
} 
相關問題