Pergunta

Por favor, me perdoe pela possibilidade de estupidez dessa pergunta, mas comecei a usar declarações preparadas. Sei que essa consulta em particular funciona, pois a testei com métodos processuais despreparados. Aqui está:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($content);
$stmt->fetch();
echo  $content;
$stmt->close();

Qualquer conselho ou pontos na direção certa são muito apreciados!

Edit 1: Apenas uma atualização sobre meu progresso enquanto tento solucionar problemas. Percebi que, como tenho uma coluna de identificação como um índice na tabela de seções, também precisava vinculá -lo como resultado, dada a declaração acima no Php.net (obrigado novamente, Bill).

Aqui está o novo código:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($id, $name, $content);
$stmt->fetch();
echo $content;
$stmt->close();

Mais uma vez obrigado a todos que podem oferecer sugestões. (Estou curioso: acho difícil depurar ao usar o estilo OOP de declarações preparadas dessa maneira. Existe, por exemplo, uma maneira fácil de simplesmente ver a consulta que realmente foi usada?)

Edit 2: Oi, e obrigado por fazer esse teste, eu realmente aprecio isso. Entendo a pergunta que você foi forçado a fazer, pois também me envolveu no cérebro por um bom tempo. Eu tenho que dizer que existe.

Se eu fizer o seguinte, como um exemplo rápido e sujo:

$name = 'introduction';
@mysql_connect('host', 'user', 'pass');
@mysql_select_db('db');
$query = "SELECT name,content FROM sections WHERE name = '$name'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
    $content = $row->content;
    echo $content;
}

Meus dados aparecem e tudo está bem. Se, no entanto, eu fizer o seguinte:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($name, $content);
$stmt->fetch();
echo  $content;
$stmt->close();

O que acredito estar correto (fique à vontade para gritar, se não, é claro), não tenho nada. Além disso, com esse código, quando faço uma validação HTML (apenas por precaução), recebo um aviso de servidor interno (500), o que considero um problema com o código SQL. Eu sou apenas louco?

Obrigado pela sua ajuda contínua, é muito apreciado!

EDIT 3: Bem, eu me sinto um idiota, mas eu consertei e Bill, sua pergunta estava certa. Não sei como diabos eu consegui colocar detalhes incorretos no banco de dados e sinto falta deles por tanto tempo, mas foi exatamente isso que aconteceu.

Mais uma vez obrigado por sua paciência e vontade de ajudar.

Foi útil?

Solução

Não vejo nada de errado com a sua preparação da declaração ou uso de parâmetros, mas há algo errado nos resultados vinculativos:

http://php.net/manual/en/mysqli-stmt.bind-result.php diz:

Observe que todas as colunas deve estar ligado depois mysqli_stmt_execute() e antes de ligar mysqli_stmt_fetch().

(ênfase meu)


O DOC acima deve ser tomado como todas as colunas em sua consulta, nem todas as colunas da sua tabela.

Ok, eu apenas tentei isso sozinho. Se eu omito o $name coluna, ele dá este aviso:

PHP Warning:  mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9
PHP Stack trace:
PHP   1. {main}() /Users/bill/workspace/PHP/mysqli.php:0
PHP   2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9

Mas ele busca os dados.

Se eu ligar os dois $name e $content Para os resultados da consulta, ele funciona sem erro ou aviso.

Então eu sou forçado a perguntar: você está claro Há uma linha no banco de dados que corresponde à sua condição? Isto é, onde name = 'introduction'? Lembre-se de que, no SQL, as comparações de string são sensíveis ao caso por padrão.

Um erro que vejo as pessoas cometem com frequência é que elas se conectam a um banco de dados diferente em seu script PHP do que o banco de dados que usam para consultas ad hoc. Portanto, você precisa ter certeza absoluta da verificação de que os dados existem no banco de dados certo.

Outras dicas

Não deveria ser

$stmt->bind_result($name, $content);

Enquanto você seleciona 2 colunas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top