dポイントプレゼントキャンペーン実施中!

cronジョブを試しています。

sqlでdayというカラムに30があるので3分ごとにdayからー1をしてカウントダウンしたいです。
sqlエラーで文字列を変換できない。
とのエラーがありました。
Catchable fatal error: Object of class PDOStatement could not be converted to string in on line 22

おそらくday-1が悪いと思うのですが、方法が分かりません。
方法を教えてください。

try
{
$stmt=new PDO("mysql:host=localhost;dbname=hoge;charset=utf8mb4", 'hoge','hoge', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
} catch (PDOException $e) {
die('database error : ' . $e->getMessage());
}
$sql = "update diary set
day = day - 1
where id = '1'";

$row=$stmt->query($sql);

echo $row;//22行目はここです

質問者からの補足コメント

  • すみません。
    書いてませんでしたがcronはちゃんと動いていました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/06/14 10:07
  • 型が違うのは理解できました。(エラーの      

    しかし
    dayはTINYINT型を使っています。
    -1が文字列型として処理させてしまったのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/06/14 10:38
  • ありがとうございました。 うまくいきました。
    ちなみになんですけど、 updete文はqueryよりexecを使うほうがよいのでしょうか?

    >PDOStatement は echo で単純表示できるものではありませんので、 何らかのメソッドなり foreach の仕組みで表示させてください。

    $row=$stmt->query($sql);

    echo $row;//22行目はここです

    上記のような使い方をするくらいなら
    while($row=$stmt->fetch())
    の形のほうが良いということでしょうか?

    No.4の回答に寄せられた補足コメントです。 補足日時:2021/06/14 17:39
  • cron対象のページをリロードすると何度も処理されてしまうのですが、
    普通、file_get_contentsなどで別ページを用意して表示させるのでしょうか?

      補足日時:2021/06/14 18:05

A 回答 (4件)

query() は結果セットを PDOStatement オブジェクトで返します。


https://www.php.net/manual/ja/pdo.query.php

PDOStatement は echo で単純表示できるものではありませんので、
何らかのメソッドなり foreach の仕組みで表示させてください。

補足を読む限り day の内容を表示したいようですが、
それならば UPDATE 後に別途 SELECT を実行して、
その結果セットの PDOStatement から
最初の行の 'day' 列の値を読み取ってください。
この回答への補足あり
    • good
    • 0

dayは関係ないような。


$rowをvar_dumpしてみて。
    • good
    • 0

>day = day - 1



文字列を数値として扱うな!というエラーメッセージであることは理解できていますか?
動的SQLを使って明示的にCAST()/CONVERT()で-1すればエラーが消えるでしょう。

詳細は、
>Object of class PDOStatement could not be converted to string in on
でググればいくらでも情報を得られます。
この回答への補足あり
    • good
    • 1

いきなりプログラムを書くのではなく、そのSQLが通るか、まずは確認してみてはいかがですか?

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!