变量未通过引用传递

时间:2015-07-28 14:15:52

标签: php sql-server

当我在ms-sql server数据库中插入一行时,出现以下错误:

  

警告:变量参数3未通过引用传递(以&开头)。传递给sqlsrv_preparesqlsrv_query的变量参数应通过引用传递,而不是通过值传递。有关详细信息,请参阅产品文档的API参考部分中的sqlsrv_preparesqlsrv_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。

我的代码出了什么问题?
感谢

1 个答案:

答案 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个组成部分组成:

  • 参考:$ iAmAVariable
  • 参考值:: 0xa384dee
  • 价值:“我是一个字符串”;
  • 内存地址:0xa384dee

参考值指向存储值的存储器地址。该参考值是存储在参考中的值。不是价值本身。

该引用仅用于查找存储变量的内存地址。通过该地址,它可以读取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);