2015-07-28 5 views
1

Когда я вставить строку в моей базе данных сервера MS-SQL, у меня есть следующее сообщение об ошибке:Переменная не передается по ссылке

Warning: Variable parameter 3 not passed by reference (prefaced with an &). Variable parameters passed to sqlsrv_prepare or sqlsrv_query should be passed by reference, not by value. For more information, see sqlsrv_prepare or sqlsrv_query in the API Reference section of the product documentation. in C:\...\ImmoToevoegen.php on line 6

же предупреждение для параметра 1 и 2.

Это мой php code:

<?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); 
?> 

Я использую, как я сказал, php с базой данных ms-sql.

Что не так с моим кодом?
Благодаря

+0

вы не используете тег формы с помощью метода POST? –

+0

@ Fred-ii- да сделаю. я иду обновить свой вопрос –

+0

«Что не так с моим кодом?» ..apart из отсутствующего тега 'form' .. отсутствует' form method' .. missing 'form submission' action .. – MaggsWeb

ответ

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 «Привет, какова величина $ variable на данный момент времени?»

Выход функции «мимолетный» не имеет «имени» и теряется в памяти.

Всегда назначайте свои выходы функции переменным, которые сохраняются до тех пор, пока вы не назовете sqlsrv_execute() и не забудьте переписать их.

редактировать

Немного и выше долга, но я действительно советую вам исследовать, как работают переменные.

переменная состоит из 4-х компонентов:

  • Ссылка: $ iAmAVariable
  • эталонное значение:: 0xa384dee
  • Значение: "Я строка";
  • А Память Адрес: 0xa384dee точки

опорное значение в адреса памяти, где хранится значение. Это контрольное значение - это то, что хранится в ссылке. Не само значение.

Ссылка используется только для поиска того, где находится адрес памяти, где хранится переменная. С помощью этого адреса он может считывать конкретную область ОЗУ и извлекать значение.

Когда вы удаляете ссылку 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); 
+0

извините, но это мне не помогает. –

+0

Мне интересно, что PDO имеет какое-либо отношение к этому коду, поскольку он использует расширение SQLSrv (http://php.net/manual/en/book.sqlsrv.php), а не PDO? Вы знаете, из-за использования 'sqlsrv_ *' функций, которые никоим образом не являются формами или формой, частью PDO;) – Sherif

+0

Да, я добавил sqlsrv позже, но пропустил первый. Связывание переменных одинаково независимо от того, используете ли вы pdo или sqlsrv. Вам нужно передать ссылку. Не выход функции. – Tschallacka

Смежные вопросы