У меня есть скрипт сервера PHP, который выбирает некоторые данные из базы данных MySQL.
Как только я получаю результат от mysql_query и mysql_fetch_assoc, хранящихся в моих собственных локальных переменных, я хочу удалить только что выбранную строку.
Проблема с этим подходом заключается в том, что, по-видимому, PHP сделал pass-by-reference для моих локальных переменных вместо pass-by-value, и мои локальные переменные становятся неопределенными после команды delete.
Есть ли способ обойти это? Вот мой код:
$query="SELECT id, peerID, name FROM names WHERE peer = $userID AND docID = '$docID' AND seqNo = $nid"; $result = mysql_query($query); if (!$result) self::logError("FAIL:1 getUsersNamesUpdate() query: ".$query."\n"); if (mysql_num_rows($result) == 0) return array(); $row = mysql_fetch_assoc($result); $result = array(); $result["id"] = $row["id"]; $result["peerID"] = $row["peerID"]; $result["name"] = $row["name"]; $query="DELETE FROM names WHERE id = $result[id];"; $result = mysql_query($query); if (!$result) self::logError("FAIL:2 getUsersNamesUpdate() query: ".$query."\n"); return $result;
Вы переписываете переменную $result
своим вторым выражением:
$query="DELETE FROM names WHERE id = $result[id];"; $result = mysql_query($query); // result does not contain the array anymore
Измените имя на другое. Это не имеет никакого отношения к обращению к вызову или к такому.
На самом деле, ваше первое присваивание значений не нужно, поскольку $row
уже является массивом:
$row = mysql_fetch_assoc($result); $result = array(); $result["id"] = $row["id"]; $result["peerID"] = $row["peerID"]; $result["name"] = $row["name"];
Вы можете просто сделать:
$row = mysql_fetch_assoc($result); // at the end return $row;
Тогда вам даже не нужно менять имя переменной для второго оператора. Но подумайте об использовании значимых имен переменных.
Прежде всего, почему бы просто не использовать только один запрос для delete
интересующей вас строки?
Что-то вроде этого должно сделать трюк, я полагаю:
delete from names where peer = $userID AND docID = '$docID' AND seqNo = $nid
Конечно, не забывайте избегать / конвертировать значения, которые должны быть 😉
Таким образом, нет необходимости в select
запроса, а затем delete
его.
Во-вторых: чтобы сделать код более понятным для чтения / понимания / поддержки, вы, вероятно, не должны повторно использовать одну и ту же переменную для нескольких целей.
Здесь переменная $resul
t используется для нескольких целей, и это затрудняет понимание:
mysql_query
mysql_query
Это немного сбивает с толку, и в один прекрасный день это приведет к ошибкам …
На самом деле, это уже есть 😉 : третье задание переопределяет данные, которые вы получаете со вторыми, и бум, вы потеряли информацию, соответствующую строке, которую вы только что удалили 😉