문제

이 질문의 어리 석음 가능성을 용서 해주세요. 그러나 방금 준비된 진술을 사용하기 시작했습니다. 준비되지 않은 절차 적 방법으로 테스트했기 때문에이 특정 쿼리가 작동한다는 것을 알고 있습니다. 여기있어:

$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();

올바른 방향으로 조언이나 요점은 대단히 감사합니다!

편집 1 : 문제 해결을 시도 할 때 진행 상황에 대한 업데이트 만 있습니다. 섹션 테이블에 인덱스로 ID 열이 있기 때문에 PHP.NET의 위의 진술을 고려할 때 결과적으로도 묶어야한다는 것을 깨달았습니다.

새 코드는 다음과 같습니다.

$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();

제안을 제공 할 수있는 모든 분들께 다시 한 번 감사드립니다. (궁금한 점 : 이런 식으로 준비된 진술의 OOP 스타일을 사용할 때 디버그하기가 어렵다는 것을 알게되었습니다. 예를 들어 실제로 사용 된 쿼리를 간단히 볼 수있는 쉬운 방법이 있습니까?)

편집 2 : 안녕하세요, 그 테스트를 해주셔서 감사합니다. 정말 감사합니다. 나는 당신이 묻는 질문을 이해합니다. 나는 그것이 존재한다고 말해야합니다.

내가 다음을 수행하면 빠르고 더 깊은 예처럼 :

$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;
}

내 데이터가 나타나고 모든 것이 잘됩니다. 그러나 다음을 수행하면 다음을 수행합니다.

$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();

내가 옳다고 생각하는 것은 (물론 그렇지 않으면 자유롭게 소리를 지르십시오. 또한, 해당 코드를 사용하면 HTML 유효성 검사 (만일 경우)를 수행 할 때 내부 서버 경고 (500)를 받고 SQL 코드에 문제가됩니다. 난 그냥 미쳤어?

지속적인 도움에 감사드립니다. 매우 감사합니다!

편집 3 : 글쎄, 나는 바보 같은 느낌이 들지만, 나는 그것을 고쳤다. 그리고 빌, 당신의 질문이 바로 나왔다. 지구상에서 어떻게 잘못된 데이터베이스 세부 정보를 넣고 오랫동안 그리워했는지 모르겠지만 정확히 일어난 일입니다.

인내심과 의지에 다시 한 번 감사드립니다.

도움이 되었습니까?

해결책

나는 당신의 진술을 준비하거나 매개 변수의 사용에 아무런 문제가 없지만, 바인딩 결과에는 문제가 있습니다.

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

주목하십시오 모든 열 이후에 구속되어야합니다 mysqli_stmt_execute() 그리고 전화하기 전에 mysqli_stmt_fetch().

(강조 광산)


위의 문서는 테이블의 모든 열이 아니라 쿼리의 모든 열로 가져와야합니다.

좋아, 난 그냥 이것을 직접 시도했다. 내가 생략하면 $name 열,이 경고를 제공합니다.

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

그러나 데이터를 가져옵니다.

내가 둘 다 묶는 경우 $name 그리고 $content 쿼리 결과에 따라 오류 나 경고없이 작동합니다.

그래서 나는 당신에게 묻습니다 : 당신은 당신입니다 확실한 데이터베이스에 귀하의 상태와 일치하는 행이 있습니까? 즉, 어디입니다 name = 'introduction'? SQL에서 문자열 비교는 기본적으로 대소 문자에 민감합니다.

사람들이 자주하는 실수 한 가지 실수는 PHP 스크립트에서 임시 쿼리에 사용하는 데이터베이스와 다른 데이터베이스에 연결한다는 것입니다. 따라서 데이터가 올바른 데이터베이스에 존재하는지 확인해야합니다.

다른 팁

그게되어서는 안됩니다

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

2 개의 열을 선택할 때

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top