2013-07-30 127 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'; 
} 
相关问题