PHP error: "Cannot pass parameter 2 by reference"
Asked Answered
H

3

78

I just need help on this PHP error which I do not quite understand:

Fatal error: Cannot pass parameter 2 by reference in /web/stud/openup/inactivatesession.php on line 13

<?php

error_reporting(E_ALL);

include('connect.php');

$createDate = mktime(0,0,0,09,05,date("Y"));
$selectedDate =  date('d-m-Y', ($createDate));

$sql = "UPDATE Session SET Active = ? WHERE DATE_FORMAT(SessionDate,'%Y-%m-%d' ) <= ?";
$update = $mysqli->prepare($sql);
$update->bind_param("is", 0, $selectedDate);  //LINE 13
$update->execute();

?>

What does this error mean? How can this error be fixed?

Hypotenuse answered 28/10, 2012 at 0:29 Comment(1)
reference for you: this issue has similar problem #8288081Profitable
C
137

The error means that the 2nd argument is expected to be a reference to a variable.

Since you are not handing a variable but an integer of value 0, it generates said error.

To circumvent this do:

$a = 0;
$update->bind_param("is", $a, $selectedDate);  //LINE 13

In case you want to understand what is happening, as opposed to just fixing your Fatal error, read this: http://php.net/manual/en/language.references.pass.php

Chrysostom answered 28/10, 2012 at 0:32 Comment(2)
PHP can be so weird sometimes.Brebner
Really funny, because the error message seems to indicate exactly the opposite :-) It said "Cannot pass parameter 2 by reference" and I was like "But I am not passing it as reference so what is the problem?"Mithgarthr
R
4

First,you shouldn't use DATE_FORMAT when you want to compare date because DATE_FORMAT changes it to string not date anymore,

UPDATE Session 
SET Active = ? 
WHERE SessionDate <= ?

Second, store the value first on a variable and pass it on the paramater

$createDate = mktime(0,0,0,09,05,date("Y"));
$selectedDate =  date('d-m-Y', ($createDate));
$active = 0;
$sql = "UPDATE Session SET Active = ? WHERE SessionDate <= ?";                                         
$update = $mysqli->prepare($sql);
$update->bind_param("is", $active, $selectedDate);  
$update->execute();
Reminiscent answered 28/10, 2012 at 0:40 Comment(0)
P
0

If you are on PHP 7.4 or later, then there's an alternative solution to creating a whole bunch of variables that you have no use for later, just to satisfy this weird requirement of bind_param.

Instead you can use the spread operator (...) with an array:

$update->bind_param("is", ...[0, $selectedDate]);

In the array you can use any variables, literals, constants, etc. without any problems.

Petroleum answered 12/7 at 19:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.