Przygotowana instrukcja mysqli select w polu longtext wraca pusta
Mam funkcję zapytania do bazy danych, która działa dobrze - poza tym, że działam na pozornie znany problem z przygotowanymi instrukcjami mysqli i polami longtext. Dzieje się tak, że pole longtext zawsze pojawia się puste, chociaż uruchomienie zapytania przez phpMyAdmin działa dobrze. Wedłughttp://www.workinginboxershorts.com/php-mysqli-returns-empty-variables-from-longtext-column, przełączenie typu danych na tekst rozwiązuje problem. Jednak w moim przypadku naprawdę wolałbym pozostawić pole jako longtext, ponieważ mogę przewidzieć, kiedy ta dodatkowa przestrzeń byłaby cenna.
Używam sparametryzowanych zapytań, co oczywiście jest problemem. Oto moja funkcja:
<code>// Bind results to an array // $stmt = sql query, $out = array to be returned function stmt_bind_assoc (&$stmt, &$out) { $data = mysqli_stmt_result_metadata($stmt); $fields = array(); $out = array(); $fields[0] = $stmt; $count = 1; while($field = mysqli_fetch_field($data)) { $fields[$count] = &$out[$field->name]; $count++; } call_user_func_array('mysqli_stmt_bind_result', $fields); } // DB Query // $query = SQL query, $params = array of parameters, $rs = whether or not a resultset is expected, $newid = whether or not to retrieve the new ID value; // $onedimensionkey = key required to convert array into simple one dimensional array function db_query($query, $params, $rs = true, $newid = false, $onedimensionkey = false) { $link = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME); if (!$link) { print 'Error connecting to MySQL Server. Errorcode: ' . mysqli_connect_error(); exit; } // Prepare the query and split the parameters array into bound values if ($sql_stmt = mysqli_prepare($link, $query)) { if ($params) { $types = ''; $new_params = array(); $params_ref = array(); // Split the params array into types string and parameters sub-array foreach ($params as $param) { $types .= $param['type']; $new_params[] = $param['value']; } // Cycle the new parameters array to make it an array by reference foreach ($new_params as $key => $parameter) { $params_ref[] = &$new_params[$key]; } call_user_func_array('mysqli_stmt_bind_param', array_merge(array($sql_stmt, $types), $params_ref)); } } else { print 'Error: ' . mysqli_error($link); exit(); } // Execute the query mysqli_stmt_execute($sql_stmt); // If there are results to retrive, do so if ($rs) { $results = array(); $rows = array(); $row = array(); stmt_bind_assoc($sql_stmt, $results); while (mysqli_stmt_fetch($sql_stmt)) { foreach ($results as $key => $value) { $row[$key] = $value; } $rows[] = $row; } if ($onedimensionkey) { $i = 0; foreach ($rows as $row) { $simplearray[$i] = $row[$onedimensionkey]; $i++; } return $simplearray; } else { return $rows; } } // If there are no results but we need the new ID, return it elseif ($newid) { return mysqli_insert_id($link); } // Close objects mysqli_stmt_close($sql_stmt); mysqli_close($link); } </code>
Zgodnie z linkiem, który zamieściłem, istnieje obejście obejmujące porządek, w którym rzeczy są wykonywane, ale albo obsługuję moje zapytanie w zupełnie inny sposób niż w przykładzie, albo po prostu nie rozumiem czegoś ważnego.
Dziękuję każdemu kto może pomóc!
EDYCJA: Dzięki odpowiedzi Coriny rozwiązałem to - dla każdego, kto wpadnie na problem, po prostu musisz dodać następujące polecenie po komendzie mysql_stmt_execute:
<code>// Execute the query mysqli_stmt_execute($sql_stmt); // Store results mysqli_stmt_store_result($sql_stmt); </code>