当我在ms-sql server数据库中插入一行时,出现以下错误:
警告:变量参数3未通过引用传递(以
&
开头)。传递给sqlsrv_prepare
或sqlsrv_query
的变量参数应通过引用传递,而不是通过值传递。有关详细信息,请参阅产品文档的API参考部分中的sqlsrv_prepare
或sqlsrv_query
。在{6}的C:\...\ImmoToevoegen.php
参数1和2的警告相同。
这是我的PHP代码:
<?php
if (!empty($_POST['omschrijving']) && !empty($_POST['woningtype']) && !empty($_POST['data'])){
$oms = $_POST['omschrijving'];
$type = $_POST['woningtype'];
$data = json_encode($_POST['data']);
$prep = sqlsrv_prepare($conn, "insert into Woning(omschrijving, data, typeid) values (?, ?, ?);", array($oms, $data, $type));
sqlsrv_execute($prep);
print "Woning is toegevoegd";
}
?>
<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="POST">
<!--param 1 "omschrijving"-->
Omschrijving:
<textarea name="omschrijving" id="omschrijving" cols="30" rows="10></textarea>
<!--param 2 "data"-->
<div>
wc: <input type="checkbox" name="data[]" value="wc"/><br/>
cv: <input type="checkbox" name="data[]" value="cv"/><br/>
boiler: <input type="checkbox" name="data[]" value="boiler"/><br/>
</div>
<!--param 3 "woningtype"-->
<select name="woningtype" id="woningtype">
<?php
//code for load data from database
print "<option value='" . $rij["ID"] . "'>" . $rij["naam"] . "</option>";
?>
</select>
</form>
<?php
sqlsrv_close($conn);
?>
我喜欢用ms-sql server数据库说的php。
我的代码出了什么问题?
感谢
答案 0 :(得分:3)
您需要将值赋给变量,然后将该变量传递给PDO / sqlsrv
<?php
$var = json_encode($_POST['data']);
//checks for all fields are filled in.
$prep = sqlsrv_prepare($conn, "insert into Woning(omschrijving, data, typeid) values (?, ?, ?);",
array($_POST['omschrijving'], $var, $_POST['woningtype']));
sqlsrv_execute($prep);
?>
PDO / sqlsrv是一个“原生”库。它不会保留任何函数输出的引用,因为它没有给出它的名称。如果你传递一个变量,那么DLL就可以查询PHP“嘿,这时候价值$变量是什么?”
功能输出“稍纵即逝”没有“名字”并在内存中丢失。
始终将您的函数输出分配给变量,直到您调用sqlsrv_execute()
并记住不要覆盖它们为止。
修改强>
稍微高于职责,但我真的建议你去调查变量是如何工作的。
变量由4个组成部分组成:
参考值指向存储值的存储器地址。该参考值是存储在参考中的值。不是价值本身。
该引用仅用于查找存储变量的内存地址。通过该地址,它可以读取RAM的特定区域并检索值。
删除引用unset($iAmAVariable)
或将引用设置为另一个变量$iAmAvariable = ""
时,不会擦除内存地址或值。您只是删除对该值的访问权限,或者将其设置为新地址的新值
PHP本身仍然具有对该值的引用。偶尔它会执行垃圾收集运行并删除所有没有附加引用的值。
未分配给传递给本机库的变量的函数输出会发生什么? PHP垃圾收集器无法检查本机库对PHP变量可能具有的任何引用,因为它在完全独立的用户空间中运行。
变量从PHP空间传递到本地空间,并且在PHP空间中没有对它的引用,它就有资格进行垃圾回收。
这是您遇到问题的代码示例中发生的情况。这就是你得到错误的原因。
函数变量和返回值仅在函数存在时才存在。它返回的那一刻,价值一切都无效,并且有资格进行垃圾收集。
您仍然将函数输出传递给sqlsrv库,该库在返回后将自行处理。
$prep = sqlsrv_prepare($conn, "insert into Woning(omschrijving, data, typeid) values (?, ?, ?);", array($oms, $data, $type));
array()
也是一个功能。
我建议你试试
$params = array($oms, $data, $type);
$prep = sqlsrv_prepare($conn, "insert into Woning(omschrijving, data, typeid) values (?, ?, ?);", $params);